home *** CD-ROM | disk | FTP | other *** search
/ PD Collection CD 1 / PD Collection CD 1.iso / textual / tex / files / !tex / latexsty3 / PICLATEX / sty
Encoding:
Text File  |  1990-01-16  |  80.1 KB  |  2,554 lines

  1.  
  2. \catcode`@=11 \catcode`!=11
  3.  
  4. \expandafter\ifx\csname fiverm\endcsname\relax
  5.   \let\fiverm\fivrm
  6. \fi
  7.   
  8. \let\!latexendpicture=\endpicture 
  9. \let\!latexframe=\frame
  10. \let\!latexlinethickness=\linethickness
  11. \let\!latexmultiput=\multiput
  12. \let\!latexput=\put
  13.  
  14. \def\@picture(#1,#2)(#3,#4){%
  15.   \@picht #2\unitlength
  16.   \setbox\@picbox\hbox to #1\unitlength\bgroup 
  17.   \let\endpicture=\!latexendpicture
  18.   \let\frame=\!latexframe
  19.   \let\linethickness=\!latexlinethickness
  20.   \let\multiput=\!latexmultiput
  21.   \let\put=\!latexput
  22.   \hskip -#3\unitlength \lower #4\unitlength \hbox\bgroup}
  23.  
  24. \catcode`@=12 \catcode`!=12
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.    
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51. \catcode`!=11 %  ***** THIS MUST NEVER BE OMITTED
  52.  
  53.   
  54.  
  55. \def\PiC{P\kern-.12em\lower.5ex\hbox{I}\kern-.075emC}
  56. \def\PiCTeX{\PiC\kern-.11em\TeX}
  57.  
  58. \def\!ifnextchar#1#2#3{%
  59.   \let\!testchar=#1%
  60.   \def\!first{#2}%
  61.   \def\!second{#3}%
  62.   \futurelet\!nextchar\!testnext}
  63. \def\!testnext{%
  64.   \ifx \!nextchar \!spacetoken 
  65.     \let\!next=\!skipspacetestagain
  66.   \else
  67.     \ifx \!nextchar \!testchar
  68.       \let\!next=\!first
  69.     \else 
  70.       \let\!next=\!second 
  71.     \fi 
  72.   \fi
  73.   \!next}
  74. \def\\{\!skipspacetestagain} 
  75.   \expandafter\def\\ {\futurelet\!nextchar\!testnext} 
  76. \def\\{\let\!spacetoken= } \\  %  ** set \spacetoken to a space token
  77.  
  78.  
  79. \def\!tfor#1:=#2\do#3{%
  80.   \edef\!fortemp{#2}%
  81.   \ifx\!fortemp\!empty 
  82.     \else
  83.     \!tforloop#2\!nil\!nil\!!#1{#3}%
  84.   \fi}
  85. \def\!tforloop#1#2\!!#3#4{%
  86.   \def#3{#1}%
  87.   \ifx #3\!nnil
  88.     \let\!nextwhile=\!fornoop
  89.   \else
  90.     #4\relax
  91.     \let\!nextwhile=\!tforloop
  92.   \fi 
  93.   \!nextwhile#2\!!#3{#4}}
  94.  
  95.  
  96. \def\!etfor#1:=#2\do#3{%
  97.   \def\!!tfor{\!tfor#1:=}%
  98.   \edef\!!!tfor{#2}%
  99.   \expandafter\!!tfor\!!!tfor\do{#3}}
  100.  
  101.  
  102. \def\!cfor#1:=#2\do#3{%
  103.   \edef\!fortemp{#2}%
  104.   \ifx\!fortemp\!empty 
  105.   \else
  106.     \!cforloop#2,\!nil,\!nil\!!#1{#3}%
  107.   \fi}
  108. \def\!cforloop#1,#2\!!#3#4{%
  109.   \def#3{#1}%
  110.   \ifx #3\!nnil
  111.     \let\!nextwhile=\!fornoop 
  112.   \else
  113.     #4\relax
  114.     \let\!nextwhile=\!cforloop
  115.   \fi
  116.   \!nextwhile#2\!!#3{#4}}
  117.  
  118.  
  119. \def\!ecfor#1:=#2\do#3{%
  120.   \def\!!cfor{\!cfor#1:=}%
  121.   \edef\!!!cfor{#2}%
  122.   \expandafter\!!cfor\!!!cfor\do{#3}}
  123.  
  124.  
  125. \def\!empty{}
  126. \def\!nnil{\!nil}
  127. \def\!fornoop#1\!!#2#3{}
  128.  
  129.  
  130. \def\!ifempty#1#2#3{%
  131.   \edef\!emptyarg{#1}%
  132.   \ifx\!emptyarg\!empty
  133.     #2%
  134.   \else
  135.     #3%
  136.   \fi}
  137.  
  138. \def\!getnext#1\from#2{%
  139.   \expandafter\!gnext#2\!#1#2}%
  140. \def\!gnext\\#1#2\!#3#4{%
  141.   \def#3{#1}%
  142.   \def#4{#2\\{#1}}%
  143.   \ignorespaces}
  144.  
  145.  
  146. \def\!getnextvalueof#1\from#2{%
  147.   \expandafter\!gnextv#2\!#1#2}%
  148. \def\!gnextv\\#1#2\!#3#4{%
  149.   #3=#1%
  150.   \def#4{#2\\{#1}}%
  151.   \ignorespaces}
  152.  
  153.  
  154. \def\!copylist#1\to#2{%
  155.   \expandafter\!!copylist#1\!#2}
  156. \def\!!copylist#1\!#2{%
  157.   \def#2{#1}\ignorespaces}
  158.  
  159.  
  160. \def\!wlet#1=#2{%
  161.   \let#1=#2 
  162.   \wlog{\string#1=\string#2}}
  163.  
  164. \def\!listaddon#1#2{%
  165.   \expandafter\!!listaddon#2\!{#1}#2}
  166. \def\!!listaddon#1\!#2#3{%
  167.   \def#3{#1\\#2}}
  168.  
  169.  
  170.  
  171. \def\!rightappend#1\withCS#2\to#3{\expandafter\!!rightappend#3\!#2{#1}#3}
  172. \def\!!rightappend#1\!#2#3#4{\def#4{#1#2{#3}}}
  173.  
  174.  
  175. \def\!leftappend#1\withCS#2\to#3{\expandafter\!!leftappend#3\!#2{#1}#3}
  176. \def\!!leftappend#1\!#2#3#4{\def#4{#2{#3}#1}}
  177.  
  178.  
  179. \def\!lop#1\to#2{\expandafter\!!lop#1\!#1#2}
  180. \def\!!lop\\#1#2\!#3#4{\def#4{#1}\def#3{#2}}
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187. \def\!loop#1\repeat{\def\!body{#1}\!iterate}
  188. \def\!iterate{\!body\let\!next=\!iterate\else\let\!next=\relax\fi\!next}
  189.  
  190. \def\!!loop#1\repeat{\def\!!body{#1}\!!iterate}
  191. \def\!!iterate{\!!body\let\!!next=\!!iterate\else\let\!!next=\relax\fi\!!next}
  192.  
  193. \def\!removept#1#2{\edef#2{\expandafter\!!removePT\the#1}}
  194. {\catcode`p=12 \catcode`t=12 \gdef\!!removePT#1pt{#1}}
  195.  
  196. \def\placevalueinpts of <#1> in #2 {%
  197.   \!removept{#1}{#2}}
  198.  
  199. \def\!mlap#1{\hbox to 0pt{\hss#1\hss}}
  200. \def\!vmlap#1{\vbox to 0pt{\vss#1\vss}}
  201.  
  202. \def\!not#1{%
  203.   #1\relax
  204.     \!switchfalse
  205.   \else
  206.     \!switchtrue
  207.   \fi
  208.   \if!switch
  209.   \ignorespaces}
  210.  
  211.  
  212.  
  213.  
  214. \let\!!!wlog=\wlog              % "\wlog" is defined in plain TeX
  215. \def\wlog#1{}    
  216.  
  217. \newdimen\headingtoplotskip     %.A.................
  218. \newdimen\linethickness         %.A..X....U........T
  219. \newdimen\longticklength        %.A................T
  220. \newdimen\plotsymbolspacing     %......D...L....Q...
  221. \newdimen\shortticklength       %.A................T
  222. \newdimen\stackleading          %.A..........P......
  223. \newdimen\tickstovaluesleading  %.A................T
  224. \newdimen\totalarclength        %......D...L....Q...
  225. \newdimen\valuestolabelleading  %.A.................
  226.  
  227. \newbox\!boxA                   %.AW...............T
  228. \newbox\!boxB                   %..W................
  229. \newbox\!picbox                 %............P......
  230. \newbox\!plotsymbol             %..........L..O.....
  231. \newbox\!putobject              %............PO...S.
  232. \newbox\!shadesymbol            %.................S.
  233.  
  234. \newcount\!countA               %.A....D..UL....Q.ST
  235. \newcount\!countB               %......D..U.....Q.ST
  236. \newcount\!countC               %...............Q..T
  237. \newcount\!countD               %...................
  238. \newcount\!countE               %.............O....T
  239. \newcount\!countF               %.............O....T
  240. \newcount\!countG               %..................T
  241. \newcount\!fiftypt              %.........U.........
  242. \newcount\!intervalno           %..........L....Q...
  243. \newcount\!npoints              %..........L........
  244. \newcount\!nsegments            %.........U.........
  245. \newcount\!ntemp                %............P......
  246. \newcount\!parity               %.................S.
  247. \newcount\!scalefactor          %..................T
  248. \newcount\!tfs                  %.......V...........
  249. \newcount\!tickcase             %..................T
  250.  
  251. \newdimen\!Xleft                %............P......
  252. \newdimen\!Xright               %............P......
  253. \newdimen\!Xsave                %.A................T
  254. \newdimen\!Ybot                 %............P......
  255. \newdimen\!Ysave                %.A................T
  256. \newdimen\!Ytop                 %............P......
  257. \newdimen\!angle                %........E..........
  258. \newdimen\!arclength            %..W......UL....Q...
  259. \newdimen\!areabloc             %.A........L........
  260. \newdimen\!arealloc             %.A........L........
  261. \newdimen\!arearloc             %.A........L........
  262. \newdimen\!areatloc             %.A........L........
  263. \newdimen\!bshrinkage           %.................S.
  264. \newdimen\!checkbot             %..........L........
  265. \newdimen\!checkleft            %..........L........
  266. \newdimen\!checkright           %..........L........
  267. \newdimen\!checktop             %..........L........
  268. \newdimen\!dimenA               %.AW.X.DVEUL..OYQRST
  269. \newdimen\!dimenB               %....X.DVEU...O.QRS.
  270. \newdimen\!dimenC               %..W.X.DVEU......RS.
  271. \newdimen\!dimenD               %..W.X.DVEU....Y.RS.
  272. \newdimen\!dimenE               %..W........G..YQ.S.
  273. \newdimen\!dimenF               %...........G..YQ.S.
  274. \newdimen\!dimenG               %...........G..YQ.S.
  275. \newdimen\!dimenH               %...........G..Y..S.
  276. \newdimen\!dimenI               %...BX.........Y....
  277. \newdimen\!distacross           %..........L....Q...
  278. \newdimen\!downlength           %..........L........
  279. \newdimen\!dp                   %.A..X.......P....S.
  280. \newdimen\!dshade               %.................S.
  281. \newdimen\!dxpos                %..W......U..P....S.
  282. \newdimen\!dxprime              %...............Q...
  283. \newdimen\!dypos                %..WB.....U..P......
  284. \newdimen\!dyprime              %...............Q...
  285. \newdimen\!ht                   %.A..X.......P....S.
  286. \newdimen\!leaderlength         %......D..U.........
  287. \newdimen\!lshrinkage           %.................S.
  288. \newdimen\!midarclength         %...............Q...
  289. \newdimen\!offset               %.A................T
  290. \newdimen\!plotheadingoffset    %.A.................
  291. \newdimen\!plotsymbolxshift     %..........L..O.....
  292. \newdimen\!plotsymbolyshift     %..........L..O.....
  293. \newdimen\!plotxorigin          %..........L..O.....
  294. \newdimen\!plotyorigin          %..........L..O.....
  295. \newdimen\!rootten              %...........G.......
  296. \newdimen\!rshrinkage           %.................S.
  297. \newdimen\!shadesymbolxshift    %.................S.
  298. \newdimen\!shadesymbolyshift    %.................S.
  299. \newdimen\!tenAa                %...........G.......
  300. \newdimen\!tenAc                %...........G.......
  301. \newdimen\!tenAe                %...........G.......
  302. \newdimen\!tshrinkage           %.................S.
  303. \newdimen\!uplength             %..........L........
  304. \newdimen\!wd                   %....X.......P....S.
  305. \newdimen\!wmax                 %...............Q...
  306. \newdimen\!wmin                 %...............Q...
  307. \newdimen\!xB                   %...............Q...
  308. \newdimen\!xC                   %...............Q...
  309. \newdimen\!xE                   %..W.....E.L....Q.S.
  310. \newdimen\!xM                   %..W.....E......Q.S.
  311. \newdimen\!xS                   %..W.....E.L....Q.S.
  312. \newdimen\!xaxislength          %.A................T
  313. \newdimen\!xdiff                %..........L........
  314. \newdimen\!xleft                %............P......
  315. \newdimen\!xloc                 %..WB.....U.......S.
  316. \newdimen\!xorigin              %.A........L.P....S.
  317. \newdimen\!xpivot               %................R..
  318. \newdimen\!xpos                 %..........L.P..Q.ST
  319. \newdimen\!xprime               %...............Q...
  320. \newdimen\!xright               %............P......
  321. \newdimen\!xshade               %.................S.
  322. \newdimen\!xshift               %..W.........PO...S.
  323. \newdimen\!xtemp                %............P......
  324. \newdimen\!xunit                %.AWBX...EUL.P..QRS.
  325. \newdimen\!xxE                  %........E..........
  326. \newdimen\!xxM                  %........E..........
  327. \newdimen\!xxS                  %........E..........
  328. \newdimen\!xxloc                %..WB....EU.........
  329. \newdimen\!yB                   %...............Q...
  330. \newdimen\!yC                   %...............Q...
  331. \newdimen\!yE                   %..W.....E.L....Q...
  332. \newdimen\!yM                   %..W.....E......Q...
  333. \newdimen\!yS                   %..W.....E.L....Q...
  334. \newdimen\!yaxislength          %.A................T
  335. \newdimen\!ybot                 %............P......
  336. \newdimen\!ydiff                %..........L........
  337. \newdimen\!yloc                 %..WB.....U.......S.
  338. \newdimen\!yorigin              %.A........L.P....S.
  339. \newdimen\!ypivot               %................R..
  340. \newdimen\!ypos                 %..........L.P..Q.ST
  341. \newdimen\!yprime               %...............Q...
  342. \newdimen\!yshade               %.................S.
  343. \newdimen\!yshift               %..W.........PO...S.
  344. \newdimen\!ytemp                %............P......
  345. \newdimen\!ytop                 %............P......
  346. \newdimen\!yunit                %.AWBX...EUL.P..QRS.
  347. \newdimen\!yyE                  %........E..........
  348. \newdimen\!yyM                  %........E..........
  349. \newdimen\!yyS                  %........E..........
  350. \newdimen\!yyloc                %..WB....EU.........
  351. \newdimen\!zpt                  %.AWBX.DVEULGP.YQ.ST
  352.  
  353. \newif\if!axisvisible           %.A.................
  354. \newif\if!gridlinestoo          %..................T
  355. \newif\if!keepPO                %...................
  356. \newif\if!placeaxislabel        %.A.................
  357. \newif\if!switch                %H..................
  358. \newif\if!xswitch               %.A................T
  359.  
  360. \newtoks\!axisLaBeL             %.A.................
  361. \newtoks\!keywordtoks           %.A.................
  362.  
  363. \newwrite\!replotfile           %.............O.....
  364.  
  365. \newhelp\!keywordhelp{The keyword mentioned in the error message in unknown. 
  366. Replace NEW KEYWORD in the indicated response by the keyword that 
  367. should have been specified.}    %.A.................
  368.  
  369. \!wlet\!!origin=\!xM                   %.A................T
  370. \!wlet\!!unit=\!uplength               %.A................T
  371. \!wlet\!Lresiduallength=\!dimenG       %.........U.........
  372. \!wlet\!Rresiduallength=\!dimenF       %.........U.........
  373. \!wlet\!axisLength=\!distacross        %.A................T
  374. \!wlet\!axisend=\!ydiff                %.A................T
  375. \!wlet\!axisstart=\!xdiff              %.A................T
  376. \!wlet\!axisxlevel=\!arclength         %.A................T
  377. \!wlet\!axisylevel=\!downlength        %.A................T
  378. \!wlet\!beta=\!dimenE                  %...............Q...
  379. \!wlet\!gamma=\!dimenF                 %...............Q...
  380. \!wlet\!shadexorigin=\!plotxorigin     %.................S.
  381. \!wlet\!shadeyorigin=\!plotyorigin     %.................S.
  382. \!wlet\!ticklength=\!xS                %..................T
  383. \!wlet\!ticklocation=\!xE              %..................T
  384. \!wlet\!ticklocationincr=\!yE          %..................T
  385. \!wlet\!tickwidth=\!yS                 %..................T
  386. \!wlet\!totalleaderlength=\!dimenE     %.........U.........
  387. \!wlet\!xone=\!xprime                  %....X..............
  388. \!wlet\!xtwo=\!dxprime                 %....X..............
  389. \!wlet\!ySsave=\!yM                    %...................
  390. \!wlet\!ybB=\!yB                       %.................S.
  391. \!wlet\!ybC=\!yC                       %.................S.
  392. \!wlet\!ybE=\!yE                       %.................S.
  393. \!wlet\!ybM=\!yM                       %.................S.
  394. \!wlet\!ybS=\!yS                       %.................S.
  395. \!wlet\!ybpos=\!yyloc                  %.................S.
  396. \!wlet\!yone=\!yprime                  %....X..............
  397. \!wlet\!ytB=\!xB                       %.................S.
  398. \!wlet\!ytC=\!xC                       %.................S.
  399. \!wlet\!ytE=\!downlength               %.................S.
  400. \!wlet\!ytM=\!arclength                %.................S.
  401. \!wlet\!ytS=\!distacross               %.................S.
  402. \!wlet\!ytpos=\!xxloc                  %.................S.
  403. \!wlet\!ytwo=\!dyprime                 %....X..............
  404.  
  405. \!zpt=0pt                              % static
  406. \!xunit=1pt
  407. \!yunit=1pt
  408. \!arearloc=\!xunit
  409. \!areatloc=\!yunit
  410. \!dshade=5pt
  411. \!leaderlength=24in
  412. \!tfs=256                              % static
  413. \!wmax=5.3pt                           % static
  414. \!wmin=2.7pt                           % static
  415. \!xaxislength=\!xunit
  416. \!xpivot=\!zpt
  417. \!yaxislength=\!yunit 
  418. \!ypivot=\!zpt
  419. \plotsymbolspacing=.4pt
  420.   \!dimenA=50pt \!fiftypt=\!dimenA     % static
  421.  
  422. \!rootten=3.162278pt                   % static
  423. \!tenAa=8.690286pt                     % static  (A5)
  424. \!tenAc=2.773839pt                     % static  (A3)
  425. \!tenAe=2.543275pt                     % static  (A1)
  426.  
  427. \def\!cosrotationangle{1}      %................R..
  428. \def\!sinrotationangle{0}      %................R..
  429. \def\!xpivotcoord{0}           %................R..
  430. \def\!xref{0}                  %............P......
  431. \def\!xshadesave{0}            %.................S.
  432. \def\!ypivotcoord{0}           %................R..
  433. \def\!yref{0}                  %............P......
  434. \def\!yshadesave{0}            %.................S.
  435. \def\!zero{0}                  %..................T
  436.  
  437. \let\wlog=\!!!wlog
  438.   
  439. \def\normalgraphs{%
  440.   \longticklength=.4\baselineskip
  441.   \shortticklength=.25\baselineskip
  442.   \tickstovaluesleading=.25\baselineskip
  443.   \valuestolabelleading=.8\baselineskip
  444.   \linethickness=.4pt
  445.   \stackleading=.17\baselineskip
  446.   \headingtoplotskip=1.5\baselineskip
  447.   \visibleaxes
  448.   \ticksout
  449.   \nogridlines
  450.   \unloggedticks}
  451. \def\setplotarea x from #1 to #2, y from #3 to #4 {%
  452.   \!arealloc=\!M{#1}\!xunit \advance \!arealloc -\!xorigin
  453.   \!areabloc=\!M{#3}\!yunit \advance \!areabloc -\!yorigin
  454.   \!arearloc=\!M{#2}\!xunit \advance \!arearloc -\!xorigin
  455.   \!areatloc=\!M{#4}\!yunit \advance \!areatloc -\!yorigin
  456.   \!initinboundscheck
  457.   \!xaxislength=\!arearloc  \advance\!xaxislength -\!arealloc
  458.   \!yaxislength=\!areatloc  \advance\!yaxislength -\!areabloc
  459.   \!plotheadingoffset=\!zpt
  460.   \!dimenput {{\setbox0=\hbox{}\wd0=\!xaxislength\ht0=\!yaxislength\box0}}
  461.      [bl] (\!arealloc,\!areabloc)}
  462. \def\visibleaxes{%
  463.   \def\!axisvisibility{\!axisvisibletrue}}
  464. \def\invisibleaxes{%
  465.   \def\!axisvisibility{\!axisvisiblefalse}}
  466.  
  467. \def\!fixkeyword#1{%
  468.   \errhelp=\!keywordhelp
  469.   \errmessage{Unrecognized keyword `#1': \the\!keywordtoks{NEW KEYWORD}'}}
  470.  
  471. \!keywordtoks={enter `i\fixkeyword}
  472.  
  473. \def\fixkeyword#1{%
  474.   \!nextkeyword#1 }
  475.  
  476. \def\axis {%
  477.   \def\!nextkeyword##1 {%
  478.     \expandafter\ifx\csname !axis##1\endcsname \relax
  479.       \def\!next{\!fixkeyword{##1}}%
  480.     \else
  481.       \def\!next{\csname !axis##1\endcsname}%
  482.     \fi
  483.     \!next}%
  484.   \!offset=\!zpt
  485.   \!axisvisibility
  486.   \!placeaxislabelfalse
  487.   \!nextkeyword}
  488.  
  489. \def\!axisbottom{%
  490.   \!axisylevel=\!areabloc
  491.   \def\!tickxsign{0}%
  492.   \def\!tickysign{-}%
  493.   \def\!axissetup{\!axisxsetup}%
  494.   \def\!axislabeltbrl{t}%
  495.   \!nextkeyword}
  496.  
  497. \def\!axistop{%
  498.   \!axisylevel=\!areatloc
  499.   \def\!tickxsign{0}%
  500.   \def\!tickysign{+}%
  501.   \def\!axissetup{\!axisxsetup}%
  502.   \def\!axislabeltbrl{b}%
  503.   \!nextkeyword}
  504.  
  505. \def\!axisleft{%
  506.   \!axisxlevel=\!arealloc
  507.   \def\!tickxsign{-}%
  508.   \def\!tickysign{0}%
  509.   \def\!axissetup{\!axisysetup}%
  510.   \def\!axislabeltbrl{r}%
  511.   \!nextkeyword}
  512.  
  513. \def\!axisright{%
  514.   \!axisxlevel=\!arearloc
  515.   \def\!tickxsign{+}%
  516.   \def\!tickysign{0}%
  517.   \def\!axissetup{\!axisysetup}%
  518.   \def\!axislabeltbrl{l}%
  519.   \!nextkeyword}
  520.  
  521. \def\!axisshiftedto#1=#2 {%
  522.   \if 0\!tickxsign
  523.     \!axisylevel=\!M{#2}\!yunit
  524.     \advance\!axisylevel -\!yorigin
  525.   \else
  526.     \!axisxlevel=\!M{#2}\!xunit
  527.     \advance\!axisxlevel -\!xorigin
  528.   \fi
  529.   \!nextkeyword}
  530.  
  531. \def\!axisvisible{%
  532.   \!axisvisibletrue  
  533.   \!nextkeyword}
  534.  
  535. \def\!axisinvisible{%
  536.   \!axisvisiblefalse
  537.   \!nextkeyword}
  538.  
  539. \def\!axislabel#1 {%
  540.   \!axisLaBeL={#1}%
  541.   \!placeaxislabeltrue
  542.   \!nextkeyword}
  543.  
  544. \expandafter\def\csname !axis/\endcsname{%
  545.   \!axissetup % This could done already by "ticks"; if so, now \relax
  546.   \if!placeaxislabel
  547.     \!placeaxislabel
  548.   \fi
  549.   \if +\!tickysign %                 ** (A "top" axis)
  550.     \!dimenA=\!axisylevel
  551.     \advance\!dimenA \!offset %      ** dimA = top of the axis structure
  552.     \advance\!dimenA -\!areatloc %   ** dimA = excess over the plot area
  553.     \ifdim \!dimenA>\!plotheadingoffset
  554.       \!plotheadingoffset=\!dimenA % ** Greatest excess over the plot area
  555.     \fi
  556.   \fi}
  557.  
  558. \def\grid #1 #2 {%
  559.   \!countA=#1\advance\!countA 1
  560.   \axis bottom invisible ticks length <\!zpt> andacross quantity {\!countA} /
  561.   \!countA=#2\advance\!countA 1
  562.   \axis left   invisible ticks length <\!zpt> andacross quantity {\!countA} / }
  563.  
  564. \def\plotheading#1 {%
  565.   \advance\!plotheadingoffset \headingtoplotskip
  566.   \!dimenput {#1} [B] <.5\!xaxislength,\!plotheadingoffset>
  567.     (\!arealloc,\!areatloc)}
  568.  
  569. \def\!axisxsetup{%
  570.   \!axisxlevel=\!arealloc
  571.   \!axisstart=\!arealloc
  572.   \!axisend=\!arearloc
  573.   \!axisLength=\!xaxislength
  574.   \!!origin=\!xorigin
  575.   \!!unit=\!xunit
  576.   \!xswitchtrue
  577.   \if!axisvisible 
  578.     \!makeaxis
  579.   \fi}
  580.  
  581. \def\!axisysetup{%
  582.   \!axisylevel=\!areabloc
  583.   \!axisstart=\!areabloc
  584.   \!axisend=\!areatloc
  585.   \!axisLength=\!yaxislength
  586.   \!!origin=\!yorigin
  587.   \!!unit=\!yunit
  588.   \!xswitchfalse
  589.   \if!axisvisible
  590.     \!makeaxis
  591.   \fi}
  592.  
  593. \def\!makeaxis{%
  594.   \setbox\!boxA=\hbox{% (Make a pseudo-y[x] tick for an x[y]-axis)
  595.     \beginpicture
  596.       \!setdimenmode
  597.       \setcoordinatesystem point at {\!zpt} {\!zpt}   
  598.       \putrule from {\!zpt} {\!zpt} to
  599.         {\!tickysign\!tickysign\!axisLength} 
  600.         {\!tickxsign\!tickxsign\!axisLength}
  601.     \endpicturesave <\!Xsave,\!Ysave>}%
  602.     \wd\!boxA=\!zpt
  603.     \!placetick\!axisstart}
  604.  
  605. \def\!placeaxislabel{%
  606.   \advance\!offset \valuestolabelleading
  607.   \if!xswitch
  608.     \!dimenput {\the\!axisLaBeL} [\!axislabeltbrl]
  609.       <.5\!axisLength,\!tickysign\!offset> (\!axisxlevel,\!axisylevel)
  610.     \advance\!offset \!dp  % ** advance offset by the "tallness"
  611.     \advance\!offset \!ht  % ** of the label
  612.   \else
  613.     \!dimenput {\the\!axisLaBeL} [\!axislabeltbrl]
  614.       <\!tickxsign\!offset,.5\!axisLength> (\!axisxlevel,\!axisylevel)
  615.   \fi
  616.   \!axisLaBeL={}}
  617.  
  618. \def\arrow <#1> [#2,#3]{%
  619.   \!ifnextchar<{\!arrow{#1}{#2}{#3}}{\!arrow{#1}{#2}{#3}<\!zpt,\!zpt> }}
  620.  
  621. \def\!arrow#1#2#3<#4,#5> from #6 #7 to #8 #9 {%
  622.   \!xloc=\!M{#8}\!xunit   
  623.   \!yloc=\!M{#9}\!yunit
  624.   \!dxpos=\!xloc  \!dimenA=\!M{#6}\!xunit  \advance \!dxpos -\!dimenA
  625.   \!dypos=\!yloc  \!dimenA=\!M{#7}\!yunit  \advance \!dypos -\!dimenA
  626.   \let\!MAH=\!M%                         ** save current c/d mode
  627.   \!setdimenmode%                        ** go into dimension mode
  628.   \!xshift=#4\relax  \!yshift=#5\relax%  ** pick up shift
  629.   \!reverserotateonly\!xshift\!yshift%   ** back rotate shift
  630.   \advance\!xshift\!xloc  \advance\!yshift\!yloc
  631.   \!xS=-\!dxpos  \advance\!xS\!xshift
  632.   \!yS=-\!dypos  \advance\!yS\!yshift
  633.   \!start (\!xS,\!yS)
  634.   \!ljoin (\!xshift,\!yshift)
  635.   \!Pythag\!dxpos\!dypos\!arclength
  636.   \!divide\!dxpos\!arclength\!dxpos  
  637.   \!dxpos=32\!dxpos  \!removept\!dxpos\!!cos
  638.   \!divide\!dypos\!arclength\!dypos  
  639.   \!dypos=32\!dypos  \!removept\!dypos\!!sin
  640.   \!halfhead{#1}{#2}{#3}%                ** draw half of arrow head
  641.   \!halfhead{#1}{-#2}{-#3}%              ** draw other half
  642.   \let\!M=\!MAH%                         ** restore old c/d mode
  643.   \ignorespaces}
  644.   \def\!halfhead#1#2#3{%
  645.     \!dimenC=-#1%                
  646.     \divide \!dimenC 2 %                 ** half way back
  647.     \!dimenD=#2\!dimenC%                 ** half the mid width
  648.     \!rotate(\!dimenC,\!dimenD)by(\!!cos,\!!sin)to(\!xM,\!yM)
  649.     \!dimenC=-#1%                        ** all the way back
  650.     \!dimenD=#3\!dimenC
  651.     \!dimenD=.5\!dimenD%                 ** half the full width
  652.     \!rotate(\!dimenC,\!dimenD)by(\!!cos,\!!sin)to(\!xE,\!yE)
  653.     \!start (\!xshift,\!yshift)
  654.     \advance\!xM\!xshift  \advance\!yM\!yshift
  655.     \advance\!xE\!xshift  \advance\!yE\!yshift
  656.     \!qjoin (\!xM,\!yM) (\!xE,\!yE) 
  657.     \ignorespaces}
  658.  
  659. \def\betweenarrows #1#2 from #3 #4 to #5 #6 {%
  660.   \!xloc=\!M{#3}\!xunit  \!xxloc=\!M{#5}\!xunit%   
  661.   \!yloc=\!M{#4}\!yunit  \!yyloc=\!M{#6}\!yunit%           
  662.   \!dxpos=\!xxloc  \advance\!dxpos by -\!xloc
  663.   \!dypos=\!yyloc  \advance\!dypos by -\!yloc
  664.   \advance\!xloc .5\!dxpos
  665.   \advance\!yloc .5\!dypos
  666.   \let\!MBA=\!M%           ** save current coord\dimen mode
  667.   \!setdimenmode%          ** express locations in dimens
  668.   \ifdim\!dypos=\!zpt
  669.     \ifdim\!dxpos<\!zpt \!dxpos=-\!dxpos \fi
  670.     \put {\!lrarrows{\!dxpos}{#1}}#2{} at {\!xloc} {\!yloc}
  671.   \else
  672.     \ifdim\!dxpos=\!zpt
  673.       \ifdim\!dypos<\!zpt \!dypos=-\!zpt \fi
  674.       \put {\!udarrows{\!dypos}{#1}}#2{} at {\!xloc} {\!yloc}
  675.     \fi
  676.   \fi
  677.   \let\!M=\!MBA%           ** restore previous c/d mode
  678.   \ignorespaces}
  679.  
  680. \def\!lrarrows#1#2{% #1=width, #2=text
  681.   {\setbox\!boxA=\hbox{$\mkern-2mu\mathord-\mkern-2mu$}%
  682.    \setbox\!boxB=\hbox{$\leftarrow$}\!dimenE=\ht\!boxB
  683.    \setbox\!boxB=\hbox{}\ht\!boxB=2\!dimenE
  684.    \hbox to #1{$\mathord\leftarrow\mkern-6mu
  685.      \cleaders\copy\!boxA\hfil
  686.      \mkern-6mu\mathord-$%
  687.      \kern.4em $\vcenter{\box\!boxB}$$\vcenter{\hbox{#2}}$\kern.4em
  688.      $\mathord-\mkern-6mu
  689.      \cleaders\copy\!boxA\hfil
  690.      \mkern-6mu\mathord\rightarrow$}}}
  691.  
  692. \def\!udarrows#1#2{% #1=width, #2=text
  693.   {\setbox\!boxB=\hbox{#2}%
  694.    \setbox\!boxA=\hbox to \wd\!boxB{\hss$\vert$\hss}%
  695.    \!dimenE=\ht\!boxA \advance\!dimenE \dp\!boxA \divide\!dimenE 2
  696.    \vbox to #1{\offinterlineskip
  697.       \vskip .05556\!dimenE
  698.       \hbox to \wd\!boxB{\hss$\mkern.4mu\uparrow$\hss}\vskip-\!dimenE
  699.       \cleaders\copy\!boxA\vfil
  700.       \vskip-\!dimenE\copy\!boxA
  701.       \vskip\!dimenE\copy\!boxB\vskip.4em
  702.       \copy\!boxA\vskip-\!dimenE
  703.       \cleaders\copy\!boxA\vfil
  704.       \vskip-\!dimenE \hbox to \wd\!boxB{\hss$\mkern.4mu\downarrow$\hss}
  705.       \vskip .05556\!dimenE}}}
  706.  
  707. \def\putbar#1breadth <#2> from #3 #4 to #5 #6 {%
  708.   \!xloc=\!M{#3}\!xunit  \!xxloc=\!M{#5}\!xunit%   
  709.   \!yloc=\!M{#4}\!yunit  \!yyloc=\!M{#6}\!yunit%           
  710.   \!dypos=\!yyloc  \advance\!dypos by -\!yloc
  711.   \!dimenI=#2  
  712.   \ifdim \!dimenI=\!zpt %            ** If 0 breadth
  713.     \putrule#1from {#3} {#4} to {#5} {#6} % ** Then draw line
  714.   \else %                            ** Else, put in a rectangle
  715.     \let\!MBar=\!M%                  ** save current c/d mode
  716.     \!setdimenmode %                 ** go into dimension mode
  717.     \divide\!dimenI 2
  718.     \ifdim \!dypos=\!zpt             
  719.       \advance \!yloc -\!dimenI %    ** Equal y coordinates
  720.       \advance \!yyloc \!dimenI
  721.     \else
  722.       \advance \!xloc -\!dimenI %    ** Equal x coordinates
  723.       \advance \!xxloc \!dimenI
  724.     \fi
  725.     \putrectangle#1corners at {\!xloc} {\!yloc} and {\!xxloc} {\!yyloc}
  726.     \let\!M=\!MBar %                 ** restore c/d mode
  727.   \fi
  728.   \ignorespaces}
  729.  
  730. \def\setbars#1breadth <#2> baseline at #3 = #4 {%
  731.   \edef\!barshift{#1}%
  732.   \edef\!barbreadth{#2}%
  733.   \edef\!barorientation{#3}%
  734.   \edef\!barbaseline{#4}%
  735.   \def\!bardobaselabel{\!bardoendlabel}%
  736.   \def\!bardoendlabel{\!barfinish}%
  737.   \let\!drawcurve=\!barcurve
  738.   \!setbars}
  739. \def\!setbars{%
  740.   \futurelet\!nextchar\!!setbars}
  741. \def\!!setbars{%
  742.   \if b\!nextchar
  743.     \def\!!!setbars{\!setbarsbget}%
  744.   \else 
  745.     \if e\!nextchar
  746.       \def\!!!setbars{\!setbarseget}%
  747.     \else
  748.       \def\!!!setbars{\relax}%
  749.     \fi
  750.   \fi
  751.   \!!!setbars}
  752. \def\!setbarsbget baselabels (#1) {%
  753.   \def\!barbaselabelorientation{#1}%
  754.   \def\!bardobaselabel{\!!bardobaselabel}%
  755.   \!setbars}
  756. \def\!setbarseget endlabels (#1) {%
  757.   \edef\!barendlabelorientation{#1}%
  758.   \def\!bardoendlabel{\!!bardoendlabel}%
  759.   \!setbars}
  760.  
  761. \def\!barcurve #1 #2 {%
  762.   \if y\!barorientation
  763.     \def\!basexarg{#1}%
  764.     \def\!baseyarg{\!barbaseline}%
  765.   \else
  766.     \def\!basexarg{\!barbaseline}%
  767.     \def\!baseyarg{#2}%
  768.   \fi
  769.   \expandafter\putbar\!barshift breadth <\!barbreadth> from {\!basexarg}
  770.     {\!baseyarg} to {#1} {#2}
  771.   \def\!endxarg{#1}%
  772.   \def\!endyarg{#2}%
  773.   \!bardobaselabel}
  774.  
  775. \def\!!bardobaselabel "#1" {%
  776.   \put {#1}\!barbaselabelorientation{} at {\!basexarg} {\!baseyarg}
  777.   \!bardoendlabel}
  778.  
  779. \def\!!bardoendlabel "#1" {%
  780.   \put {#1}\!barendlabelorientation{} at {\!endxarg} {\!endyarg}
  781.   \!barfinish}
  782.  
  783. \def\!barfinish{%
  784.   \!ifnextchar/{\!finish}{\!barcurve}}
  785.  
  786.  
  787. \def\putrectangle{%
  788.   \!ifnextchar<{\!putrectangle}{\!putrectangle<\!zpt,\!zpt> }}
  789. \def\!putrectangle<#1,#2> corners at #3 #4 and #5 #6 {%
  790.   \!xone=\!M{#3}\!xunit  \!xtwo=\!M{#5}\!xunit%   
  791.   \!yone=\!M{#4}\!yunit  \!ytwo=\!M{#6}\!yunit%           
  792.   \ifdim \!xtwo<\!xone
  793.     \!dimenI=\!xone  \!xone=\!xtwo  \!xtwo=\!dimenI
  794.   \fi
  795.   \ifdim \!ytwo<\!yone
  796.     \!dimenI=\!yone  \!yone=\!ytwo  \!ytwo=\!dimenI
  797.   \fi
  798.   \!dimenI=#1\relax  \advance\!xone\!dimenI  \advance\!xtwo\!dimenI
  799.   \!dimenI=#2\relax  \advance\!yone\!dimenI  \advance\!ytwo\!dimenI
  800.   \let\!MRect=\!M%                  ** save current coord/dimen mode
  801.   \!setdimenmode
  802.   \!shaderectangle
  803.   \!dimenI=.5\linethickness
  804.   \advance \!xone  -\!dimenI%       ** adjust x-location to overlap corners
  805.   \advance \!xtwo   \!dimenI%       ** ditto
  806.   \putrule from {\!xone} {\!yone} to {\!xtwo} {\!yone} 
  807.   \putrule from {\!xone} {\!ytwo} to {\!xtwo} {\!ytwo} 
  808.   \advance \!xone   \!dimenI%       ** restore original x-values
  809.   \advance \!xtwo  -\!dimenI% 
  810.   \advance \!yone  -\!dimenI%       ** adjust y-location to overlap corners
  811.   \advance \!ytwo   \!dimenI%       ** ditto
  812.   \putrule from {\!xone} {\!yone} to {\!xone} {\!ytwo} 
  813.   \putrule from {\!xtwo} {\!yone} to {\!xtwo} {\!ytwo} 
  814.   \let\!M=\!MRect%                  ** restore coord/dimen mode
  815.   \ignorespaces}
  816.  
  817. \def\shaderectangleson{%     
  818.   \def\!shaderectangle{\!!shaderectangle}%
  819.   \ignorespaces}
  820. \def\shaderectanglesoff{%
  821.   \def\!shaderectangle{}%
  822.   \ignorespaces}
  823.  
  824. \shaderectanglesoff
  825.  
  826. \def\!!shaderectangle{%
  827.   \!dimenA=\!xtwo  \advance \!dimenA -\!xone
  828.   \!dimenB=\!ytwo  \advance \!dimenB -\!yone
  829.   \ifdim \!dimenA<\!dimenB
  830.     \!startvshade (\!xone,\!yone,\!ytwo)
  831.     \!lshade      (\!xtwo,\!yone,\!ytwo)
  832.   \else
  833.     \!starthshade (\!yone,\!xone,\!xtwo)
  834.     \!lshade      (\!ytwo,\!xone,\!xtwo)
  835.   \fi
  836.   \ignorespaces}
  837.   
  838. \def\frame{%
  839.   \!ifnextchar<{\!frame}{\!frame<\!zpt> }}
  840. \long\def\!frame<#1> #2{%
  841.   \beginpicture
  842.     \setcoordinatesystem units <1pt,1pt> point at 0 0 
  843.     \put {#2} [Bl] at 0 0 
  844.     \!dimenA=#1\relax
  845.     \!dimenB=\!wd \advance \!dimenB \!dimenA
  846.     \!dimenC=\!ht \advance \!dimenC \!dimenA
  847.     \!dimenD=\!dp \advance \!dimenD \!dimenA
  848.     \let\!MFr=\!M
  849.     \!setdimenmode
  850.     \putrectangle corners at {-\!dimenA} {-\!dimenD} and {\!dimenB} {\!dimenC}
  851.     \!setcoordmode
  852.     \let\!M=\!MFr
  853.   \endpicture
  854.   \ignorespaces}
  855.  
  856. \def\rectangle <#1> <#2> {%
  857.   \setbox0=\hbox{}\wd0=#1\ht0=#2\frame {\box0}}
  858.  
  859. \def\plot{%
  860.   \!ifnextchar"{\!plotfromfile}{\!drawcurve}}
  861. \def\!plotfromfile"#1"{%
  862.   \expandafter\!drawcurve \input #1 /}
  863.  
  864. \def\setquadratic{%
  865.   \let\!drawcurve=\!qcurve
  866.   \let\!!Shade=\!!qShade
  867.   \let\!!!Shade=\!!!qShade}
  868.  
  869. \def\setlinear{%
  870.   \let\!drawcurve=\!lcurve
  871.   \let\!!Shade=\!!lShade
  872.   \let\!!!Shade=\!!!lShade}
  873.  
  874. \def\sethistograms{%
  875.   \let\!drawcurve=\!hcurve}
  876.  
  877. \def\!qcurve #1 #2 {%
  878.   \!start (#1,#2)
  879.   \!Qjoin}
  880. \def\!Qjoin#1 #2 #3 #4 {%
  881.   \!qjoin (#1,#2) (#3,#4)             % \!qjoin  is defined in QUADRATIC
  882.   \!ifnextchar/{\!finish}{\!Qjoin}}
  883.  
  884. \def\!lcurve #1 #2 {%
  885.   \!start (#1,#2)
  886.   \!Ljoin}
  887. \def\!Ljoin#1 #2 {%
  888.   \!ljoin (#1,#2)                    % \!ljoin  is defined in LINEAR
  889.   \!ifnextchar/{\!finish}{\!Ljoin}}
  890.  
  891. \def\!finish/{\ignorespaces}
  892.  
  893. \def\!hcurve #1 #2 {%
  894.   \edef\!hxS{#1}%
  895.   \edef\!hyS{#2}%
  896.   \!hjoin}
  897. \def\!hjoin#1 #2 {%
  898.   \putrectangle corners at {\!hxS} {\!hyS} and {#1} {#2}
  899.   \edef\!hxS{#1}%
  900.   \!ifnextchar/{\!finish}{\!hjoin}}
  901.  
  902. \def\vshade #1 #2 #3 {%
  903.   \!startvshade (#1,#2,#3)
  904.   \!Shadewhat}
  905.  
  906. \def\hshade #1 #2 #3 {%
  907.   \!starthshade (#1,#2,#3)
  908.   \!Shadewhat}
  909.  
  910. \def\!Shadewhat{%
  911.   \futurelet\!nextchar\!Shade}
  912. \def\!Shade{%
  913.   \if <\!nextchar
  914.     \def\!nextShade{\!!Shade}%
  915.   \else
  916.     \if /\!nextchar
  917.       \def\!nextShade{\!finish}%
  918.     \else
  919.       \def\!nextShade{\!!!Shade}%
  920.     \fi
  921.   \fi
  922.   \!nextShade}
  923. \def\!!lShade<#1> #2 #3 #4 {%
  924.   \!lshade <#1> (#2,#3,#4)                 % \!lshade is defined in SHADING
  925.   \!Shadewhat}
  926. \def\!!!lShade#1 #2 #3 {%
  927.   \!lshade (#1,#2,#3)
  928.   \!Shadewhat} 
  929. \def\!!qShade<#1> #2 #3 #4 #5 #6 #7 {%
  930.   \!qshade <#1> (#2,#3,#4) (#5,#6,#7)      % \!qshade is defined in SHADING
  931.   \!Shadewhat}
  932. \def\!!!qShade#1 #2 #3 #4 #5 #6 {%
  933.   \!qshade (#1,#2,#3) (#4,#5,#6)
  934.   \!Shadewhat} 
  935.  
  936. \setlinear
  937.  
  938.  
  939.  
  940.  
  941.  
  942. \def\setdashpattern <#1>{%
  943.   \def\!Flist{}\def\!Blist{}\def\!UDlist{}%
  944.   \!countA=0
  945.   \!ecfor\!item:=#1\do{%
  946.     \!dimenA=\!item\relax
  947.     \expandafter\!rightappend\the\!dimenA\withCS{\\}\to\!UDlist%
  948.     \advance\!countA  1
  949.     \ifodd\!countA
  950.       \expandafter\!rightappend\the\!dimenA\withCS{\!Rule}\to\!Flist%
  951.       \expandafter\!leftappend\the\!dimenA\withCS{\!Rule}\to\!Blist%
  952.     \else 
  953.       \expandafter\!rightappend\the\!dimenA\withCS{\!Skip}\to\!Flist%
  954.       \expandafter\!leftappend\the\!dimenA\withCS{\!Skip}\to\!Blist%
  955.     \fi}%
  956.   \!leaderlength=\!zpt
  957.   \def\!Rule##1{\advance\!leaderlength  ##1}%
  958.   \def\!Skip##1{\advance\!leaderlength  ##1}%
  959.   \!Flist%
  960.   \ifdim\!leaderlength>\!zpt 
  961.   \else
  962.     \def\!Flist{\!Skip{24in}}\def\!Blist{\!Skip{24in}}\ignorespaces
  963.     \def\!UDlist{\\{\!zpt}\\{24in}}\ignorespaces
  964.     \!leaderlength=24in
  965.   \fi
  966.   \!dashingon}   
  967.  
  968.  
  969. \def\!dashingon{%
  970.   \def\!advancedashing{\!!advancedashing}%
  971.   \def\!drawlinearsegment{\!lineardashed}%
  972.   \def\!puthline{\!putdashedhline}%
  973.   \def\!putvline{\!putdashedvline}%
  974.   \ignorespaces}% 
  975. \def\!dashingoff{%
  976.   \def\!advancedashing{\relax}%
  977.   \def\!drawlinearsegment{\!linearsolid}%
  978.   \def\!puthline{\!putsolidhline}%
  979.   \def\!putvline{\!putsolidvline}%
  980.   \ignorespaces}
  981.  
  982.  
  983. \def\setdots{%
  984.   \!ifnextchar<{\!setdots}{\!setdots<5pt>}}
  985. \def\!setdots<#1>{%
  986.   \!dimenB=#1\advance\!dimenB -\plotsymbolspacing
  987.   \ifdim\!dimenB<\!zpt
  988.     \!dimenB=\!zpt
  989.   \fi
  990. \setdashpattern <\plotsymbolspacing,\!dimenB>}
  991.  
  992. \def\setdotsnear <#1> for <#2>{%
  993.   \!dimenB=#2\relax  \advance\!dimenB -.05pt  
  994.   \!dimenC=#1\relax  \!countA=\!dimenC 
  995.   \!dimenD=\!dimenB  \advance\!dimenD .5\!dimenC  \!countB=\!dimenD
  996.   \divide \!countB  \!countA
  997.   \ifnum 1>\!countB 
  998.     \!countB=1
  999.   \fi
  1000.   \divide\!dimenB  \!countB
  1001.   \setdots <\!dimenB>}
  1002.  
  1003. \def\setdashes{%
  1004.   \!ifnextchar<{\!setdashes}{\!setdashes<5pt>}}
  1005. \def\!setdashes<#1>{\setdashpattern <#1,#1>}
  1006.  
  1007. \def\setdashesnear <#1> for <#2>{%
  1008.   \!dimenB=#2\relax  
  1009.   \!dimenC=#1\relax  \!countA=\!dimenC 
  1010.   \!dimenD=\!dimenB  \advance\!dimenD .5\!dimenC  \!countB=\!dimenD
  1011.   \divide \!countB  \!countA
  1012.   \ifodd \!countB 
  1013.   \else 
  1014.     \advance \!countB  1
  1015.   \fi
  1016.   \divide\!dimenB  \!countB
  1017.   \setdashes <\!dimenB>}
  1018.  
  1019. \def\setsolid{%
  1020.   \def\!Flist{\!Rule{24in}}\def\!Blist{\!Rule{24in}}%  
  1021.   \def\!UDlist{\\{24in}\\{\!zpt}}%
  1022.   \!dashingoff}  
  1023. \setsolid
  1024.  
  1025. \def\findlength#1{%
  1026.   \begingroup
  1027.     \setdashpattern <0pt, \maxdimen>
  1028.     \setplotsymbol ({})  
  1029.     \dontsavelinesandcurves
  1030.     #1%
  1031.   \endgroup
  1032.   \ignorespaces}
  1033.  
  1034.  
  1035.   
  1036.  
  1037. \def\!divide#1#2#3{%
  1038.   \!dimenB=#1%                      **  dimB  holds current remainder (r)
  1039.   \!dimenC=#2%                      **  dimC  holds divisor (d)
  1040.   \!dimenD=\!dimenB%                **  dimD  holds quotient q=r/d for this 
  1041.   \divide \!dimenD \!dimenC%        **    step, in units of scaled pts
  1042.   \!dimenA=\!dimenD%                **  dimA  eventually holds answer (a)
  1043.   \multiply\!dimenD \!dimenC%       **  r <-- r - dq
  1044.   \advance\!dimenB -\!dimenD%       **  First step complete. Have integer part
  1045.   \!dimenD=\!dimenC%                **  Temporarily use dimD to hold |d|
  1046.     \ifdim\!dimenD<\!zpt \!dimenD=-\!dimenD 
  1047.   \fi
  1048.   \ifdim\!dimenD<64pt%              **  Branch on the magnitude of |d|
  1049.     \!divstep[\!tfs]\!divstep[\!tfs]%
  1050.   \else 
  1051.     \!!divide
  1052.   \fi
  1053.   #3=\!dimenA\ignorespaces}
  1054.  
  1055. \def\!!divide{%
  1056.   \ifdim\!dimenD<256pt
  1057.     \!divstep[64]\!divstep[32]\!divstep[32]%
  1058.   \else 
  1059.     \!divstep[8]\!divstep[8]\!divstep[8]\!divstep[8]\!divstep[8]%
  1060.     \!dimenA=2\!dimenA
  1061.   \fi}
  1062.  
  1063.  
  1064. \def\!divstep[#1]{%                 **  #1 = "B"
  1065.   \!dimenB=#1\!dimenB%              **  r <-- B*r
  1066.   \!dimenD=\!dimenB%                **  dimD  holds quotient q=r/d for this 
  1067.     \divide \!dimenD by \!dimenC%   **    step, in units of scaled pts
  1068.   \!dimenA=#1\!dimenA%              **  a <-- B*a + q
  1069.     \advance\!dimenA by \!dimenD%
  1070.   \multiply\!dimenD by \!dimenC%    **  r <-- r - dq
  1071.     \advance\!dimenB by -\!dimenD}
  1072.  
  1073. \def\Divide <#1> by <#2> forming <#3> {%
  1074.   \!divide{#1}{#2}{#3}}
  1075.  
  1076.  
  1077.  
  1078.  
  1079.  
  1080.  
  1081. \def\circulararc{%
  1082.   \ellipticalarc axes ratio 1:1 }
  1083.  
  1084. \def\ellipticalarc axes ratio #1:#2 #3 degrees from #4 #5 center at #6 #7 {%
  1085.   \!angle=#3pt\relax%                    ** get angle
  1086.   \ifdim\!angle>\!zpt 
  1087.     \def\!sign{}%                        ** counterclockwise
  1088.   \else 
  1089.     \def\!sign{-}\!angle=-\!angle%       ** clockwise
  1090.   \fi
  1091.   \!xxloc=\!M{#6}\!xunit%                ** convert CENTER to dimension
  1092.   \!yyloc=\!M{#7}\!yunit     
  1093.   \!xxS=\!M{#4}\!xunit%                  ** get STARTing point on rim of ellipse
  1094.   \!yyS=\!M{#5}\!yunit
  1095.   \advance\!xxS -\!xxloc%                ** make center of ellipse (0,0)
  1096.   \advance\!yyS -\!yyloc
  1097.   \!divide\!xxS{#1pt}\!xxS %             ** scale point on ellipse to point on 
  1098.   \!divide\!yyS{#2pt}\!yyS %                 corresponding circle
  1099.   \let\!MC=\!M%                          ** save current c/d mode
  1100.   \!setdimenmode%                        ** go into dimension mode
  1101.   \!xS=#1\!xxS  \advance\!xS\!xxloc
  1102.   \!yS=#2\!yyS  \advance\!yS\!yyloc
  1103.   \!start (\!xS,\!yS)%
  1104.   \!loop\ifdim\!angle>14.9999pt%         ** draw in major portion of ellipse 
  1105.     \!rotate(\!xxS,\!yyS)by(\!cos,\!sign\!sin)to(\!xxM,\!yyM) 
  1106.     \!rotate(\!xxM,\!yyM)by(\!cos,\!sign\!sin)to(\!xxE,\!yyE)
  1107.     \!xM=#1\!xxM  \advance\!xM\!xxloc  \!yM=#2\!yyM  \advance\!yM\!yyloc
  1108.     \!xE=#1\!xxE  \advance\!xE\!xxloc  \!yE=#2\!yyE  \advance\!yE\!yyloc
  1109.     \!qjoin (\!xM,\!yM) (\!xE,\!yE)
  1110.     \!xxS=\!xxE  \!yyS=\!yyE 
  1111.     \advance \!angle -15pt
  1112.   \repeat
  1113.   \ifdim\!angle>\!zpt%                   ** complete remaining arc, if any
  1114.     \!angle=100.53096\!angle%            ** convert angle to radians, divide
  1115.     \divide \!angle 360 %                **   by 2, and multiply by 32
  1116.     \!sinandcos\!angle\!!sin\!!cos%      ** get 32*sin & 32*cos
  1117.     \!rotate(\!xxS,\!yyS)by(\!!cos,\!sign\!!sin)to(\!xxM,\!yyM) 
  1118.     \!rotate(\!xxM,\!yyM)by(\!!cos,\!sign\!!sin)to(\!xxE,\!yyE)
  1119.     \!xM=#1\!xxM  \advance\!xM\!xxloc  \!yM=#2\!yyM  \advance\!yM\!yyloc
  1120.     \!xE=#1\!xxE  \advance\!xE\!xxloc  \!yE=#2\!yyE  \advance\!yE\!yyloc
  1121.     \!qjoin (\!xM,\!yM) (\!xE,\!yE)
  1122.   \fi
  1123.   \let\!M=\!MC%                          ** restore c/d mode
  1124.   \ignorespaces}%                        **   if appropriate
  1125.  
  1126.  
  1127. \def\!rotate(#1,#2)by(#3,#4)to(#5,#6){% 
  1128.   \!dimenA=#3#1\advance \!dimenA -#4#2%   ** Rcos(x+t)=Rcosx*cost - Rsinx*sint
  1129.   \!dimenB=#3#2\advance \!dimenB  #4#1%   ** Rsin(x+t)=Rsinx*cost + Rcosx*sint
  1130.   \divide \!dimenA 32  \divide \!dimenB 32 
  1131.   #5=\!dimenA  #6=\!dimenB
  1132.   \ignorespaces}
  1133. \def\!sin{4.17684}%                       ** 32*sin(pi/24) (pi/24=7.5deg)
  1134. \def\!cos{31.72624}%                      ** 32*cos(pi/24)
  1135.  
  1136.  
  1137. \def\!sinandcos#1#2#3{%
  1138.  \!dimenD=#1%                **  angle is expressed in radians/32: 1pt = 1/32rad
  1139.  \!dimenA=\!dimenD%          **  dimA will eventually contain 32sin(angle)in pts
  1140.  \!dimenB=32pt%              **  dimB will eventually contain 32cos(angle)in pts
  1141.  \!removept\!dimenD\!value%  **  get value of 32*angle, without "pt"
  1142.  \!dimenC=\!dimenD%          **  holds 32*angle**i/i! in pts
  1143.  \!dimenC=\!value\!dimenC \divide\!dimenC by 64 %   ** now 32*angle**2/2
  1144.  \advance\!dimenB by -\!dimenC%                     ** 32-32*angle**2/2
  1145.  \!dimenC=\!value\!dimenC \divide\!dimenC by 96 %   ** now 32*angle**3/3!
  1146.  \advance\!dimenA by -\!dimenC%                     ** now 32*(angle-angle**3/6)
  1147.  \!dimenC=\!value\!dimenC \divide\!dimenC by 128 %  ** now 32*angle**4/4!
  1148.  \advance\!dimenB by \!dimenC%
  1149.  \!removept\!dimenA#2%                              ** set 32*sin(angle)
  1150.  \!removept\!dimenB#3%                              ** set 32*cos(angle)
  1151.  \ignorespaces}
  1152.  
  1153. \def\putrule#1from #2 #3 to #4 #5 {%
  1154.   \!xloc=\!M{#2}\!xunit  \!xxloc=\!M{#4}\!xunit%   
  1155.   \!yloc=\!M{#3}\!yunit  \!yyloc=\!M{#5}\!yunit%           
  1156.   \!dxpos=\!xxloc  \advance\!dxpos by -\!xloc
  1157.   \!dypos=\!yyloc  \advance\!dypos by -\!yloc
  1158.   \ifdim\!dypos=\!zpt
  1159.     \def\!!Line{\!puthline{#1}}\ignorespaces
  1160.   \else
  1161.     \ifdim\!dxpos=\!zpt
  1162.       \def\!!Line{\!putvline{#1}}\ignorespaces
  1163.     \else 
  1164.        \def\!!Line{}
  1165.     \fi
  1166.   \fi
  1167.   \let\!ML=\!M%           ** save current coord\dimen mode
  1168.   \!setdimenmode%         ** express locations in dimens
  1169.   \!!Line%
  1170.   \let\!M=\!ML%           ** restore previous c/d mode
  1171.   \ignorespaces}
  1172.  
  1173.  
  1174. \def\!putsolidhline#1{%
  1175.   \ifdim\!dxpos>\!zpt 
  1176.     \put{\!hline\!dxpos}#1[l] at {\!xloc} {\!yloc}
  1177.   \else 
  1178.     \put{\!hline{-\!dxpos}}#1[l] at {\!xxloc} {\!yyloc}
  1179.   \fi
  1180.   \ignorespaces}
  1181.  
  1182. \def\!putsolidvline#1{%
  1183.   \ifdim\!dypos>\!zpt 
  1184.     \put{\!vline\!dypos}#1[b] at {\!xloc} {\!yloc}
  1185.   \else 
  1186.     \put{\!vline{-\!dypos}}#1[b] at {\!xxloc} {\!yyloc}
  1187.   \fi
  1188.   \ignorespaces}
  1189.  
  1190. \def\!hline#1{\hbox to #1{\leaders \hrule height\linethickness\hfill}}
  1191. \def\!vline#1{\vbox to #1{\leaders \vrule width\linethickness\vfill}}
  1192.  
  1193.  
  1194. \def\!putdashedhline#1{%
  1195.   \ifdim\!dxpos>\!zpt 
  1196.     \!DLsetup\!Flist\!dxpos
  1197.     \put{\hbox to \!totalleaderlength{\!hleaders}\!hpartialpattern\!Rtrunc}
  1198.       #1[l] at {\!xloc} {\!yloc} 
  1199.   \else 
  1200.     \!DLsetup\!Blist{-\!dxpos}
  1201.     \put{\!hpartialpattern\!Ltrunc\hbox to \!totalleaderlength{\!hleaders}}
  1202.       #1[r] at {\!xloc} {\!yloc} 
  1203.   \fi
  1204.   \ignorespaces}
  1205.  
  1206. \def\!putdashedvline#1{%
  1207.   \!dypos=-\!dypos%            ** vertical leaders go from top to bottom
  1208.   \ifdim\!dypos>\!zpt 
  1209.     \!DLsetup\!Flist\!dypos 
  1210.     \put{\vbox{\vbox to \!totalleaderlength{\!vleaders}
  1211.       \!vpartialpattern\!Rtrunc}}#1[t] at {\!xloc} {\!yloc} 
  1212.   \else 
  1213.     \!DLsetup\!Blist{-\!dypos}
  1214.     \put{\vbox{\!vpartialpattern\!Ltrunc
  1215.       \vbox to \!totalleaderlength{\!vleaders}}}#1[b] at {\!xloc} {\!yloc} 
  1216.   \fi
  1217.   \ignorespaces}
  1218.  
  1219.  
  1220. \def\!DLsetup#1#2{%            ** Dashed-Line set up
  1221.   \let\!RSlist=#1%             ** set !Rule-Skip list
  1222.   \!countB=#2%                 ** convert rule length to integer (number of sps)
  1223.   \!countA=\!leaderlength%     ** ditto, leaderlength
  1224.   \divide\!countB by \!countA% ** number of complete leader units
  1225.   \!totalleaderlength=\!countB\!leaderlength
  1226.   \!Rresiduallength=#2%
  1227.   \advance \!Rresiduallength by -\!totalleaderlength%  \** excess length
  1228.   \!Lresiduallength=\!leaderlength
  1229.   \advance \!Lresiduallength by -\!Rresiduallength
  1230.   \ignorespaces}
  1231.  
  1232. \def\!hleaders{%
  1233.   \def\!Rule##1{\vrule height\linethickness width##1}%
  1234.   \def\!Skip##1{\hskip##1}%
  1235.   \leaders\hbox{\!RSlist}\hfill}
  1236.  
  1237. \def\!hpartialpattern#1{%
  1238.   \!dimenA=\!zpt \!dimenB=\!zpt 
  1239.   \def\!Rule##1{#1{##1}\vrule height\linethickness width\!dimenD}%
  1240.   \def\!Skip##1{#1{##1}\hskip\!dimenD}%
  1241.   \!RSlist}
  1242.  
  1243. \def\!vleaders{%
  1244.   \def\!Rule##1{\hrule width\linethickness height##1}%
  1245.   \def\!Skip##1{\vskip##1}%
  1246.   \leaders\vbox{\!RSlist}\vfill}
  1247.  
  1248. \def\!vpartialpattern#1{%
  1249.   \!dimenA=\!zpt \!dimenB=\!zpt 
  1250.   \def\!Rule##1{#1{##1}\hrule width\linethickness height\!dimenD}%
  1251.   \def\!Skip##1{#1{##1}\vskip\!dimenD}%
  1252.   \!RSlist}
  1253.  
  1254. \def\!Rtrunc#1{\!trunc{#1}>\!Rresiduallength}
  1255. \def\!Ltrunc#1{\!trunc{#1}<\!Lresiduallength}
  1256.  
  1257. \def\!trunc#1#2#3{%          
  1258.   \!dimenA=\!dimenB         
  1259.   \advance\!dimenB by #1%
  1260.   \!dimenD=\!dimenB  \ifdim\!dimenD#2#3\!dimenD=#3\fi
  1261.   \!dimenC=\!dimenA  \ifdim\!dimenC#2#3\!dimenC=#3\fi
  1262.   \advance \!dimenD by -\!dimenC}
  1263.  
  1264.  
  1265.  
  1266.    
  1267.  
  1268.  
  1269.  
  1270.  
  1271.  
  1272. \def\!start (#1,#2){%
  1273.   \!plotxorigin=\!xorigin  \advance \!plotxorigin by \!plotsymbolxshift
  1274.   \!plotyorigin=\!yorigin  \advance \!plotyorigin by \!plotsymbolyshift
  1275.   \!xS=\!M{#1}\!xunit \!yS=\!M{#2}\!yunit
  1276.   \!rotateaboutpivot\!xS\!yS
  1277.   \!copylist\!UDlist\to\!!UDlist% **\!UDlist has the form \\{dimen1}\\{dimen2}..
  1278.   \!getnextvalueof\!downlength\from\!!UDlist
  1279.   \!distacross=\!zpt%             ** 1st point goes at start of curve
  1280.   \!intervalno=0 %                ** initialize interval counter
  1281.   \global\totalarclength=\!zpt%   ** initialize distance traveled along curve
  1282.   \ignorespaces}
  1283.  
  1284.  
  1285. \def\!ljoin (#1,#2){%
  1286.   \advance\!intervalno by 1
  1287.   \!xE=\!M{#1}\!xunit \!yE=\!M{#2}\!yunit
  1288.   \!rotateaboutpivot\!xE\!yE
  1289.   \!xdiff=\!xE \advance \!xdiff by -\!xS%**  xdiff = xE - xS
  1290.   \!ydiff=\!yE \advance \!ydiff by -\!yS%**  ydiff = yE - yS
  1291.   \!Pythag\!xdiff\!ydiff\!arclength%     **  arclength = sqrt(xdiff**2+ydiff**2) 
  1292.   \global\advance \totalarclength by \!arclength%
  1293.   \!drawlinearsegment%   ** set by dashpat to \!linearsolid or \!lineardashed
  1294.   \!xS=\!xE \!yS=\!yE%   ** shift ending points to starting points
  1295.   \ignorespaces}
  1296.  
  1297.  
  1298. \def\!linearsolid{%
  1299.   \!npoints=\!arclength
  1300.   \!countA=\plotsymbolspacing
  1301.   \divide\!npoints by \!countA%      ** now #pts =. arclength/plotsymbolspacing
  1302.   \ifnum \!npoints<1 
  1303.     \!npoints=1 
  1304.   \fi
  1305.   \divide\!xdiff by \!npoints
  1306.   \divide\!ydiff by \!npoints
  1307.   \!xpos=\!xS \!ypos=\!yS
  1308.   \loop\ifnum\!npoints>-1
  1309.     \!plotifinbounds
  1310.     \advance \!xpos by \!xdiff
  1311.     \advance \!ypos by \!ydiff
  1312.     \advance \!npoints by -1
  1313.   \repeat
  1314.   \ignorespaces}
  1315.  
  1316.  
  1317. \def\!lineardashed{%
  1318.   \ifdim\!distacross>\!arclength
  1319.     \advance \!distacross by -\!arclength  %nothing to plot in this interval
  1320.   \else
  1321.     \loop\ifdim\!distacross<\!arclength
  1322.       \!divide\!distacross\!arclength\!dimenA%  ** dimA = across/arclength
  1323.       \!removept\!dimenA\!t%  ** \!t holds value in dimA, without the "pt"
  1324.       \!xpos=\!t\!xdiff \advance \!xpos by \!xS
  1325.       \!ypos=\!t\!ydiff \advance \!ypos by \!yS
  1326.       \!plotifinbounds
  1327.       \advance\!distacross by \plotsymbolspacing
  1328.       \!advancedashing
  1329.     \repeat  
  1330.     \advance \!distacross by -\!arclength%    ** prepare for next interval 
  1331.   \fi
  1332.   \ignorespaces}
  1333.  
  1334.  
  1335. \def\!!advancedashing{%
  1336.   \advance\!downlength by -\plotsymbolspacing
  1337.   \ifdim \!downlength>\!zpt
  1338.   \else
  1339.     \advance\!distacross by \!downlength
  1340.     \!getnextvalueof\!uplength\from\!!UDlist
  1341.     \advance\!distacross by \!uplength
  1342.     \!getnextvalueof\!downlength\from\!!UDlist
  1343.   \fi}
  1344.  
  1345.  
  1346. \def\inboundscheckoff{%
  1347.   \def\!plotifinbounds{\!plot(\!xpos,\!ypos)}%
  1348.   \def\!initinboundscheck{\relax}\ignorespaces}
  1349. \def\inboundscheckon{%
  1350.   \def\!plotifinbounds{\!!plotifinbounds}%
  1351.   \def\!initinboundscheck{\!!initinboundscheck}%
  1352.   \!initinboundscheck\ignorespaces} 
  1353. \inboundscheckoff
  1354.  
  1355. \def\!!plotifinbounds{%
  1356.   \ifdim \!xpos<\!checkleft
  1357.   \else
  1358.     \ifdim \!xpos>\!checkright
  1359.     \else
  1360.       \ifdim \!ypos<\!checkbot
  1361.       \else
  1362.          \ifdim \!ypos>\!checktop
  1363.          \else
  1364.            \!plot(\!xpos,\!ypos)
  1365.          \fi 
  1366.       \fi
  1367.     \fi
  1368.   \fi}
  1369.  
  1370.  
  1371. \def\!!initinboundscheck{%
  1372.   \!checkleft=\!arealloc     \advance\!checkleft by \!xorigin
  1373.   \!checkright=\!arearloc    \advance\!checkright by \!xorigin
  1374.   \!checkbot=\!areabloc      \advance\!checkbot by \!yorigin
  1375.   \!checktop=\!areatloc      \advance\!checktop by \!yorigin}
  1376.  
  1377.  
  1378. \def\!logten#1#2{%
  1379.   \expandafter\!!logten#1\!nil
  1380.   \!removept\!dimenF#2%
  1381.   \ignorespaces}
  1382.  
  1383. \def\!!logten#1#2\!nil{%
  1384.   \if -#1%
  1385.     \!dimenF=\!zpt
  1386.     \def\!next{\ignorespaces}%
  1387.   \else
  1388.     \if +#1%
  1389.       \def\!next{\!!logten#2\!nil}%
  1390.     \else
  1391.       \if .#1%
  1392.         \def\!next{\!!logten0.#2\!nil}%
  1393.       \else
  1394.         \def\!next{\!!!logten#1#2..\!nil}%
  1395.       \fi
  1396.     \fi
  1397.   \fi
  1398.   \!next}
  1399.  
  1400. \def\!!!logten#1#2.#3.#4\!nil{%
  1401.   \!dimenF=1pt %                 ** DimF holds log10 original argument
  1402.   \if 0#1%                      
  1403.     \!!logshift#3pt %            ** Argument < 1
  1404.   \else %                        ** Argument >= 1
  1405.     \!logshift#2/%               ** Shift decimal pt as many places
  1406.     \!dimenE=#1.#2#3pt %         **   as there are figures in #2
  1407.   \fi %                          ** Now dimE holds revised X want log10 of
  1408.   \ifdim \!dimenE<\!rootten%          ** Transform X to XX between sqrt(10) 
  1409.     \multiply \!dimenE 10 %           **   and 10*sqrt(10)
  1410.     \advance  \!dimenF -1pt
  1411.   \fi
  1412.   \!dimenG=\!dimenE%                  ** dimG <- (XX + 10)
  1413.     \advance\!dimenG 10pt
  1414.   \advance\!dimenE -10pt %            ** dimE <- (XX - 10)
  1415.   \multiply\!dimenE 10 %              ** dimE = 10*(XX-10)
  1416.   \!divide\!dimenE\!dimenG\!dimenE%   ** Now dimE=10t==10*(XX-10)/(XX+10)
  1417.   \!removept\!dimenE\!t%              ** !t=10t, with "pt" removed
  1418.   \!dimenG=\!t\!dimenE%               ** dimG=100t**2
  1419.   \!removept\!dimenG\!tt%             ** !tt=100t**2, with "pt" removed
  1420.   \!dimenH=\!tt\!tenAe%               ** dimH=10*a5*(10t)**2 /100
  1421.     \divide\!dimenH 100
  1422.   \advance\!dimenH \!tenAc%           ** ditto + 10*a3
  1423.   \!dimenH=\!tt\!dimenH%              ** ditto * (10t)**2 /100
  1424.     \divide\!dimenH 100   
  1425.   \advance\!dimenH \!tenAa%           ** ditto + 10*a1
  1426.   \!dimenH=\!t\!dimenH%               ** ditto * 10t / 100
  1427.     \divide\!dimenH 100 %             ** Now dimH = log10(XX) - 1
  1428.   \advance\!dimenF \!dimenH}%         ** dimF = log10(X)
  1429.  
  1430. \def\!logshift#1{%
  1431.   \if #1/%
  1432.     \def\!next{\ignorespaces}%
  1433.   \else
  1434.     \advance\!dimenF 1pt 
  1435.     \def\!next{\!logshift}%
  1436.   \fi 
  1437.   \!next}
  1438.  
  1439.  \def\!!logshift#1{%
  1440.    \advance\!dimenF -1pt
  1441.    \if 0#1%
  1442.      \def\!next{\!!logshift}%
  1443.    \else
  1444.      \if p#1%
  1445.        \!dimenF=1pt
  1446.        \def\!next{\!dimenE=1p}%
  1447.      \else
  1448.        \def\!next{\!dimenE=#1.}%
  1449.      \fi
  1450.    \fi
  1451.    \!next}
  1452.  
  1453.  
  1454.   
  1455.   
  1456.  
  1457.  
  1458. \def\beginpicture{%
  1459.   \setbox\!picbox=\hbox\bgroup%
  1460.   \!xleft=\maxdimen  
  1461.   \!xright=-\maxdimen
  1462.   \!ybot=\maxdimen
  1463.   \!ytop=-\maxdimen}
  1464.  
  1465. \def\endpicture{%
  1466.   \ifdim\!xleft=\maxdimen%  ** check if nothing was put in picbox
  1467.     \!xleft=\!zpt \!xright=\!zpt \!ybot=\!zpt \!ytop=\!zpt 
  1468.   \fi
  1469.   \global\!Xleft=\!xleft \global\!Xright=\!xright
  1470.   \global\!Ybot=\!ybot \global\!Ytop=\!ytop
  1471.   \egroup%
  1472.   \ht\!picbox=\!Ytop  \dp\!picbox=-\!Ybot
  1473.   \ifdim\!Ybot>\!zpt
  1474.   \else 
  1475.     \ifdim\!Ytop<\!zpt
  1476.       \!Ybot=\!Ytop
  1477.     \else
  1478.       \!Ybot=\!zpt
  1479.     \fi
  1480.   \fi
  1481.   \hbox{\kern-\!Xleft\lower\!Ybot\box\!picbox\kern\!Xright}}
  1482.  
  1483. \def\endpicturesave <#1,#2>{%
  1484.   \endpicture \global #1=\!Xleft \global #2=\!Ybot \ignorespaces}
  1485.  
  1486.  
  1487. \def\setcoordinatesystem{%
  1488.   \!ifnextchar{u}{\!getlengths }
  1489.     {\!getlengths units <\!xunit,\!yunit>}}
  1490. \def\!getlengths units <#1,#2>{%
  1491.   \!xunit=#1\relax
  1492.   \!yunit=#2\relax
  1493.   \!ifcoordmode 
  1494.     \let\!SCnext=\!SCccheckforRP
  1495.   \else
  1496.     \let\!SCnext=\!SCdcheckforRP
  1497.   \fi
  1498.   \!SCnext}
  1499. \def\!SCccheckforRP{%
  1500.   \!ifnextchar{p}{\!cgetreference }
  1501.     {\!cgetreference point at {\!xref} {\!yref} }}
  1502. \def\!cgetreference point at #1 #2 {%
  1503.   \edef\!xref{#1}\edef\!yref{#2}%
  1504.   \!xorigin=\!xref\!xunit  \!yorigin=\!yref\!yunit  
  1505.   \!initinboundscheck % ** See linear.tex
  1506.   \ignorespaces}
  1507. \def\!SCdcheckforRP{%
  1508.   \!ifnextchar{p}{\!dgetreference}%
  1509.     {\ignorespaces}}
  1510. \def\!dgetreference point at #1 #2 {%
  1511.   \!xorigin=#1\relax  \!yorigin=#2\relax
  1512.   \ignorespaces}
  1513.  
  1514.  
  1515. \long\def\put#1#2 at #3 #4 {%
  1516.   \!setputobject{#1}{#2}%
  1517.   \!xpos=\!M{#3}\!xunit  \!ypos=\!M{#4}\!yunit  
  1518.   \!rotateaboutpivot\!xpos\!ypos%
  1519.   \advance\!xpos -\!xorigin  \advance\!xpos -\!xshift
  1520.   \advance\!ypos -\!yorigin  \advance\!ypos -\!yshift
  1521.   \kern\!xpos\raise\!ypos\box\!putobject\kern-\!xpos%
  1522.   \!doaccounting\ignorespaces}
  1523.  
  1524. \long\def\multiput #1#2 at {%
  1525.   \!setputobject{#1}{#2}%
  1526.   \!ifnextchar"{\!putfromfile}{\!multiput}}
  1527. \def\!putfromfile"#1"{%
  1528.   \expandafter\!multiput \input #1 /}
  1529. \def\!multiput{%
  1530.   \futurelet\!nextchar\!!multiput}
  1531. \def\!!multiput{%
  1532.   \if *\!nextchar
  1533.     \def\!nextput{\!alsoby}%
  1534.   \else
  1535.     \if /\!nextchar
  1536.       \def\!nextput{\!finishmultiput}%
  1537.     \else
  1538.       \def\!nextput{\!alsoat}%
  1539.     \fi
  1540.   \fi
  1541.   \!nextput}
  1542. \def\!finishmultiput/{%
  1543.   \setbox\!putobject=\hbox{}%
  1544.   \ignorespaces}
  1545.  
  1546. \def\!alsoat#1 #2 {%
  1547.   \!xpos=\!M{#1}\!xunit  \!ypos=\!M{#2}\!yunit  
  1548.   \!rotateaboutpivot\!xpos\!ypos%
  1549.   \advance\!xpos -\!xorigin  \advance\!xpos -\!xshift
  1550.   \advance\!ypos -\!yorigin  \advance\!ypos -\!yshift
  1551.   \kern\!xpos\raise\!ypos\copy\!putobject\kern-\!xpos%
  1552.   \!doaccounting
  1553.   \!multiput}
  1554.  
  1555. \def\!alsoby*#1 #2 #3 {%
  1556.   \!dxpos=\!M{#2}\!xunit \!dypos=\!M{#3}\!yunit 
  1557.   \!rotateonly\!dxpos\!dypos
  1558.   \!ntemp=#1%
  1559.   \!!loop\ifnum\!ntemp>0
  1560.     \advance\!xpos by \!dxpos  \advance\!ypos by \!dypos
  1561.     \kern\!xpos\raise\!ypos\copy\!putobject\kern-\!xpos%
  1562.     \advance\!ntemp by -1
  1563.   \repeat
  1564.   \!doaccounting 
  1565.   \!multiput}
  1566.  
  1567. \def\accountingon{\def\!doaccounting{\!!doaccounting}\ignorespaces}
  1568. \def\accountingoff{\def\!doaccounting{}\ignorespaces}
  1569. \accountingon
  1570. \def\!!doaccounting{%
  1571.   \!xtemp=\!xpos  
  1572.   \!ytemp=\!ypos
  1573.   \ifdim\!xtemp<\!xleft 
  1574.      \!xleft=\!xtemp 
  1575.   \fi
  1576.   \advance\!xtemp by  \!wd 
  1577.   \ifdim\!xright<\!xtemp 
  1578.     \!xright=\!xtemp
  1579.   \fi
  1580.   \advance\!ytemp by -\!dp
  1581.   \ifdim\!ytemp<\!ybot  
  1582.     \!ybot=\!ytemp
  1583.   \fi
  1584.   \advance\!ytemp by  \!dp
  1585.   \advance\!ytemp by  \!ht 
  1586.   \ifdim\!ytemp>\!ytop  
  1587.     \!ytop=\!ytemp  
  1588.   \fi}
  1589.  
  1590. \long\def\!setputobject#1#2{%
  1591.   \setbox\!putobject=\hbox{#1}%
  1592.   \!ht=\ht\!putobject  \!dp=\dp\!putobject  \!wd=\wd\!putobject
  1593.   \wd\!putobject=\!zpt
  1594.   \!xshift=.5\!wd   \!yshift=.5\!ht   \advance\!yshift by -.5\!dp
  1595.   \edef\!putorientation{#2}%
  1596.   \expandafter\!SPOreadA\!putorientation[]\!nil%
  1597.   \expandafter\!SPOreadB\!putorientation<\!zpt,\!zpt>\!nil\ignorespaces}
  1598.  
  1599. \def\!SPOreadA#1[#2]#3\!nil{\!etfor\!orientation:=#2\do\!SPOreviseshift}
  1600.  
  1601. \def\!SPOreadB#1<#2,#3>#4\!nil{\advance\!xshift by -#2\advance\!yshift by -#3}
  1602.  
  1603. \def\!SPOreviseshift{%
  1604.   \if l\!orientation 
  1605.     \!xshift=\!zpt
  1606.   \else 
  1607.     \if r\!orientation 
  1608.       \!xshift=\!wd
  1609.     \else 
  1610.       \if b\!orientation
  1611.         \!yshift=-\!dp
  1612.       \else 
  1613.         \if B\!orientation 
  1614.           \!yshift=\!zpt
  1615.         \else 
  1616.           \if t\!orientation 
  1617.             \!yshift=\!ht
  1618.           \fi 
  1619.         \fi
  1620.       \fi
  1621.     \fi
  1622.   \fi}
  1623.  
  1624.  
  1625. \long\def\!dimenput#1#2(#3,#4){%
  1626.   \!setputobject{#1}{#2}%
  1627.   \!xpos=#3\advance\!xpos by -\!xshift
  1628.   \!ypos=#4\advance\!ypos by -\!yshift
  1629.   \kern\!xpos\raise\!ypos\box\!putobject\kern-\!xpos%
  1630.   \!doaccounting\ignorespaces}
  1631.  
  1632.  
  1633. \def\!setdimenmode{%
  1634.   \let\!M=\!M!!\ignorespaces}
  1635. \def\!setcoordmode{%
  1636.   \let\!M=\!M!\ignorespaces}
  1637. \def\!ifcoordmode{%
  1638.   \ifx \!M \!M!}
  1639. \def\!ifdimenmode{%
  1640.   \ifx \!M \!M!!}
  1641. \def\!M!#1#2{#1#2} 
  1642. \def\!M!!#1#2{#1}
  1643. \!setcoordmode
  1644. \let\setdimensionmode=\!setdimenmode
  1645. \let\setcoordinatemode=\!setcoordmode
  1646.  
  1647. \def\Xdistance#1{%
  1648.   \!M{#1}\!xunit
  1649.   \ignorespaces}
  1650. \def\Ydistance#1{%
  1651.   \!M{#1}\!yunit
  1652.   \ignorespaces}
  1653.  
  1654. \def\stack{%
  1655.   \!ifnextchar[{\!stack}{\!stack[c]}}
  1656. \def\!stack[#1]{%
  1657.   \let\!lglue=\hfill \let\!rglue=\hfill
  1658.   \expandafter\let\csname !#1glue\endcsname=\relax
  1659.   \!ifnextchar<{\!!stack}{\!!stack<\stackleading>}}
  1660. \def\!!stack<#1>#2{%
  1661.   \vbox{\def\!valueslist{}\!ecfor\!value:=#2\do{%
  1662.     \expandafter\!rightappend\!value\withCS{\\}\to\!valueslist}%
  1663.     \!lop\!valueslist\to\!value
  1664.     \let\\=\cr\lineskiplimit=\maxdimen\lineskip=#1%
  1665.     \baselineskip=-1000pt\halign{\!lglue##\!rglue\cr \!value\!valueslist\cr}}%
  1666.   \ignorespaces}
  1667.  
  1668. \def\lines{%
  1669.   \!ifnextchar[{\!lines}{\!lines[c]}}
  1670. \def\!lines[#1]#2{%
  1671.   \let\!lglue=\hfill \let\!rglue=\hfill
  1672.   \expandafter\let\csname !#1glue\endcsname=\relax
  1673.   \vbox{\halign{\!lglue##\!rglue\cr #2\crcr}}%
  1674.   \ignorespaces}
  1675.  
  1676. \def\Lines{%
  1677.   \!ifnextchar[{\!Lines}{\!Lines[c]}}
  1678. \def\!Lines[#1]#2{%
  1679.   \let\!lglue=\hfill \let\!rglue=\hfill
  1680.   \expandafter\let\csname !#1glue\endcsname=\relax
  1681.   \vtop{\halign{\!lglue##\!rglue\cr #2\crcr}}%
  1682.   \ignorespaces}
  1683.  
  1684.  
  1685.  
  1686.  
  1687. \def\setplotsymbol(#1#2){%
  1688.   \!setputobject{#1}{#2}
  1689.   \setbox\!plotsymbol=\box\!putobject%
  1690.   \!plotsymbolxshift=\!xshift 
  1691.   \!plotsymbolyshift=\!yshift 
  1692.   \ignorespaces}
  1693.  
  1694. \setplotsymbol({\fiverm .})%       ** initialize plotsymbol
  1695.  
  1696.  
  1697.  
  1698. \def\!!plot(#1,#2){%
  1699.   \!dimenA=-\!plotxorigin \advance \!dimenA by #1%    ** over
  1700.   \!dimenB=-\!plotyorigin \advance \!dimenB by #2%    ** up
  1701.   \kern\!dimenA\raise\!dimenB\copy\!plotsymbol\kern-\!dimenA%
  1702.   \ignorespaces}
  1703.  
  1704. \def\!!!plot(#1,#2){%
  1705.   \!dimenA=-\!plotxorigin \advance \!dimenA by #1%    ** over
  1706.   \!dimenB=-\!plotyorigin \advance \!dimenB by #2%    ** up
  1707.   \kern\!dimenA\raise\!dimenB\copy\!plotsymbol\kern-\!dimenA%
  1708.   \!countE=\!dimenA
  1709.   \!countF=\!dimenB
  1710.   \immediate\write\!replotfile{\the\!countE,\the\!countF.}%
  1711.   \ignorespaces}
  1712.  
  1713. \def\savelinesandcurves on "#1" {%
  1714.   \immediate\closeout\!replotfile
  1715.   \immediate\openout\!replotfile=#1%
  1716.   \let\!plot=\!!!plot}
  1717.  
  1718. \def\dontsavelinesandcurves {%
  1719.   \let\!plot=\!!plot}
  1720. \dontsavelinesandcurves
  1721.  
  1722. {\catcode`\%=11\xdef\!Commentsignal{%}}
  1723. \def\writesavefile#1 {%
  1724.   \immediate\write\!replotfile{\!Commentsignal #1}%
  1725.   \ignorespaces}
  1726.  
  1727. \def\replot"#1" {%
  1728.   \expandafter\!replot\input #1 /}
  1729. \def\!replot#1,#2. {%
  1730.   \!dimenA=#1sp
  1731.   \kern\!dimenA\raise#2sp\copy\!plotsymbol\kern-\!dimenA
  1732.   \futurelet\!nextchar\!!replot}
  1733. \def\!!replot{%
  1734.   \if /\!nextchar 
  1735.     \def\!next{\!finish}%
  1736.   \else
  1737.     \def\!next{\!replot}%
  1738.   \fi
  1739.   \!next}
  1740.  
  1741.  
  1742.  
  1743. \def\!Pythag#1#2#3{%
  1744.   \!dimenE=#1\relax                                     
  1745.   \ifdim\!dimenE<\!zpt 
  1746.     \!dimenE=-\!dimenE 
  1747.   \fi%                                            ** dimE = |x|
  1748.   \!dimenF=#2\relax
  1749.   \ifdim\!dimenF<\!zpt 
  1750.     \!dimenF=-\!dimenF 
  1751.   \fi%                                            ** dimF = |y|
  1752.   \advance \!dimenF by \!dimenE%                  ** dimF = s = |x|+|y|
  1753.   \ifdim\!dimenF=\!zpt 
  1754.     \!dimenG=\!zpt%                               ** dimG = z = sqrt(x**2+y**2)
  1755.   \else 
  1756.     \!divide{8\!dimenE}\!dimenF\!dimenE%          ** now dimE = 8t = (8|x|)/s
  1757.     \advance\!dimenE by -4pt%                     ** 8tau = (8t-4)*2
  1758.       \!dimenE=2\!dimenE%                         **   (tau = 2*t - 1)
  1759.     \!removept\!dimenE\!!t%                       ** 8tau, without "pt"
  1760.     \!dimenE=\!!t\!dimenE%                        ** (8tau)**2, in pts
  1761.     \advance\!dimenE by 64pt%                     ** u = [64 + (8tau)**2]/2
  1762.     \divide \!dimenE by 2%                        **   [u = (8f)**2]
  1763.     \!dimenH=7pt%                                 ** initial guess g at sqrt(u)
  1764.     \!!Pythag\!!Pythag\!!Pythag%                  ** 3 iterations give sqrt(u)
  1765.     \!removept\!dimenH\!!t%                       ** 8f=sqrt(u), without "pt"
  1766.     \!dimenG=\!!t\!dimenF%                        ** z = (8f)*s/8
  1767.     \divide\!dimenG by 8
  1768.   \fi
  1769.   #3=\!dimenG
  1770.   \ignorespaces}
  1771.  
  1772. \def\!!Pythag{%                                   ** Newton-Raphson for sqrt
  1773.   \!divide\!dimenE\!dimenH\!dimenI%               ** v = u/g
  1774.   \advance\!dimenH by \!dimenI%                   ** g <-- (g + u/g)/2
  1775.     \divide\!dimenH by 2}
  1776.  
  1777. \def\placehypotenuse for <#1> and <#2> in <#3> {%
  1778.   \!Pythag{#1}{#2}{#3}}
  1779.  
  1780.  
  1781.  
  1782.  
  1783. \def\!qjoin (#1,#2) (#3,#4){%
  1784.   \advance\!intervalno by 1
  1785.   \!ifcoordmode
  1786.     \edef\!xmidpt{#1}\edef\!ymidpt{#2}%
  1787.   \else
  1788.     \!dimenA=#1\relax \edef\!xmidpt{\the\!dimenA}%
  1789.     \!dimenA=#2\relax \edef\!xmidpt{\the\!dimenA}%
  1790.   \fi
  1791.   \!xM=\!M{#1}\!xunit  \!yM=\!M{#2}\!yunit   \!rotateaboutpivot\!xM\!yM
  1792.   \!xE=\!M{#3}\!xunit  \!yE=\!M{#4}\!yunit   \!rotateaboutpivot\!xE\!yE
  1793.   \!dimenA=\!xM  \advance \!dimenA by -\!xS%   ** dimA = I = xM - xS
  1794.   \!dimenB=\!xE  \advance \!dimenB by -\!xM%   ** dimB = II = xE-xM
  1795.   \!xB=3\!dimenA \advance \!xB by -\!dimenB%   ** b=3I-II
  1796.   \!xC=2\!dimenB \advance \!xC by -2\!dimenA%  ** c=2(II-I)
  1797.   \!dimenA=\!yM  \advance \!dimenA by -\!yS%   
  1798.   \!dimenB=\!yE  \advance \!dimenB by -\!yM%  
  1799.   \!yB=3\!dimenA \advance \!yB by -\!dimenB%  
  1800.   \!yC=2\!dimenB \advance \!yC by -2\!dimenA% 
  1801.   \!xprime=\!xB  \!yprime=\!yB%          ** x'(t) = b + 2ct
  1802.   \!dxprime=.5\!xC  \!dyprime=.5\!yC%    ** dt=1/4 ==> dx'(t) = c/2
  1803.   \!getf \!midarclength=\!dimenA
  1804.   \!getf \advance \!midarclength by 4\!dimenA
  1805.   \!getf \advance \!midarclength by \!dimenA
  1806.   \divide \!midarclength by 12
  1807.   \!arclength=\!dimenA
  1808.   \!getf \advance \!arclength by 4\!dimenA
  1809.   \!getf \advance \!arclength by \!dimenA
  1810.   \divide \!arclength by 12%             ** Now have arc length over [1/2,1]
  1811.   \advance \!arclength by \!midarclength
  1812.   \global\advance \totalarclength by \!arclength
  1813.   \ifdim\!distacross>\!arclength 
  1814.     \advance \!distacross by -\!arclength%   ** nothing 
  1815.   \else
  1816.     \!initinverseinterp%  ** initialize for inverse interpolation on arc length
  1817.     \loop\ifdim\!distacross<\!arclength%     ** loop over points on arc 
  1818.       \!inverseinterp%    ** find  t  such that arc length[0,t] = distacross,
  1819.       \!xpos=\!t\!xC \advance\!xpos by \!xB
  1820.         \!xpos=\!t\!xpos \advance \!xpos by \!xS
  1821.       \!ypos=\!t\!yC \advance\!ypos by \!yB
  1822.         \!ypos=\!t\!ypos \advance \!ypos by \!yS
  1823.       \!plotifinbounds%                       ** plot point if in bounds
  1824.       \advance\!distacross \plotsymbolspacing%** advance arc length for next pt
  1825.       \!advancedashing%                       ** see "linear"
  1826.     \repeat  
  1827.     \advance \!distacross by -\!arclength%    ** prepare for next interval 
  1828.   \fi
  1829.   \!xS=\!xE%              ** shift ending points to starting points
  1830.   \!yS=\!yE
  1831.   \ignorespaces}
  1832.  
  1833.  
  1834. \def\!getf{\!Pythag\!xprime\!yprime\!dimenA%
  1835.   \advance\!xprime by \!dxprime
  1836.   \advance\!yprime by \!dyprime}
  1837.  
  1838.  
  1839. \def\!initinverseinterp{%
  1840.   \ifdim\!arclength>\!zpt
  1841.     \!divide{8\!midarclength}\!arclength\!dimenE% ** dimE=8w=8r/s, where  r 
  1842.     \ifdim\!dimenE<\!wmin \!setinverselinear
  1843.     \else 
  1844.       \ifdim\!dimenE>\!wmax \!setinverselinear
  1845.       \else%                                    ** w  in range: initialize
  1846.         \def\!inverseinterp{\!inversequad}\ignorespaces
  1847.          \!removept\!dimenE\!Ew%           **  8w, without "pt"
  1848.          \!dimenF=-\!Ew\!dimenE%           **  -(8w)**2
  1849.          \advance\!dimenF by 32pt%         **  32 - (8w)**2
  1850.          \!dimenG=8pt 
  1851.          \advance\!dimenG by -\!dimenE%    **  8 - 8w
  1852.          \!dimenG=\!Ew\!dimenG%            **  (8w)*(8-8w)
  1853.          \!divide\!dimenF\!dimenG\!beta%   **  beta = (32-(8w)**2)/(8w(8-8w))
  1854.          \!gamma=1pt
  1855.          \advance \!gamma by -\!beta%      **  gamma = 1-beta
  1856.       \fi%       ** end of the \ifdim\!dimenE>\!wmax
  1857.     \fi%         ** end of the \ifdim\!dimenE<\!wmin
  1858.   \fi%           ** end of the \ifdim\!arclength>\!zpt
  1859.   \ignorespaces}
  1860.  
  1861.  
  1862. \def\!inversequad{%
  1863.   \!divide\!distacross\!arclength\!dimenG%   ** dimG = v = distacross/arclength
  1864.   \!removept\!dimenG\!v%                     ** v, without "pt"
  1865.   \!dimenG=\!v\!gamma%                       ** gamma*v
  1866.   \advance\!dimenG by \!beta%                ** beta + gamma*v
  1867.   \!dimenG=\!v\!dimenG%                      ** t = v*(beta + gamma*v)
  1868.   \!removept\!dimenG\!t}%                    ** t, without "pt"
  1869.  
  1870.  
  1871. \def\!setinverselinear{%
  1872.   \def\!inverseinterp{\!inverselinear}%
  1873.   \divide\!dimenE by 8 \!removept\!dimenE\!t
  1874.   \!countC=\!intervalno \multiply \!countC 2
  1875.   \!countB=\!countC     \advance \!countB -1
  1876.   \!countA=\!countB     \advance \!countA -1
  1877.   \wlog{\the\!countB th point (\!xmidpt,\!ymidpt) being plotted 
  1878.     doesn't lie in the}%
  1879.   \wlog{ middle third of the arc between the \the\!countA th 
  1880.     and \the\!countC th points:}%
  1881.   \wlog{ [arc length \the\!countA\space to \the\!countB]/[arc length 
  1882.     \the \!countA\space to \the\!countC]=\!t.}%
  1883.   \ignorespaces}
  1884.  
  1885. \def\!inverselinear{% 
  1886.   \!divide\!distacross\!arclength\!dimenG
  1887.   \!removept\!dimenG\!t}
  1888.  
  1889.  
  1890.  
  1891. \def\startrotation{%
  1892.   \let\!rotateaboutpivot=\!!rotateaboutpivot
  1893.   \let\!rotateonly=\!!rotateonly
  1894.   \!ifnextchar{b}{\!getsincos }%
  1895.     {\!getsincos by {\!cosrotationangle} {\!sinrotationangle} }}
  1896. \def\!getsincos by #1 #2 {%
  1897.   \edef\!cosrotationangle{#1}%
  1898.   \edef\!sinrotationangle{#2}%
  1899.   \!ifcoordmode 
  1900.     \let\!ROnext=\!ccheckforpivot
  1901.   \else
  1902.     \let\!ROnext=\!dcheckforpivot
  1903.   \fi
  1904.   \!ROnext}
  1905. \def\!ccheckforpivot{%
  1906.   \!ifnextchar{a}{\!cgetpivot}%
  1907.     {\!cgetpivot about {\!xpivotcoord} {\!ypivotcoord} }}
  1908. \def\!cgetpivot about #1 #2 {%
  1909.   \edef\!xpivotcoord{#1}%
  1910.   \edef\!ypivotcoord{#2}%
  1911.   \!xpivot=#1\!xunit  \!ypivot=#2\!yunit
  1912.   \ignorespaces}
  1913. \def\!dcheckforpivot{%
  1914.   \!ifnextchar{a}{\!dgetpivot}{\ignorespaces}}
  1915. \def\!dgetpivot about #1 #2 {%
  1916.   \!xpivot=#1\relax  \!ypivot=#2\relax
  1917.   \ignorespaces}
  1918.   
  1919.  
  1920. \def\stoprotation{%
  1921.   \let\!rotateaboutpivot=\!!!rotateaboutpivot
  1922.   \let\!rotateonly=\!!!rotateonly
  1923.   \ignorespaces}
  1924.  
  1925. \def\!!rotateaboutpivot#1#2{%
  1926.   \!dimenA=#1\relax  \advance\!dimenA -\!xpivot
  1927.   \!dimenB=#2\relax  \advance\!dimenB -\!ypivot
  1928.   \!dimenC=\!cosrotationangle\!dimenA
  1929.     \advance \!dimenC -\!sinrotationangle\!dimenB
  1930.   \!dimenD=\!cosrotationangle\!dimenB
  1931.     \advance \!dimenD  \!sinrotationangle\!dimenA
  1932.   \advance\!dimenC \!xpivot  \advance\!dimenD \!ypivot
  1933.   #1=\!dimenC  #2=\!dimenD
  1934.   \ignorespaces}
  1935.  
  1936. \def\!!rotateonly#1#2{%
  1937.   \!dimenA=#1\relax  \!dimenB=#2\relax 
  1938.   \!dimenC=\!cosrotationangle\!dimenA
  1939.     \advance \!dimenC -\!rotsign\!sinrotationangle\!dimenB
  1940.   \!dimenD=\!cosrotationangle\!dimenB
  1941.     \advance \!dimenD  \!rotsign\!sinrotationangle\!dimenA
  1942.   #1=\!dimenC  #2=\!dimenD
  1943.   \ignorespaces}
  1944. \def\!rotsign{}
  1945. \def\!!!rotateaboutpivot#1#2{\relax}
  1946. \def\!!!rotateonly#1#2{\relax}
  1947. \stoprotation
  1948.  
  1949. \def\!reverserotateonly#1#2{%
  1950.   \def\!rotsign{-}%
  1951.   \!rotateonly{#1}{#2}%
  1952.   \def\!rotsign{}%
  1953.   \ignorespaces}
  1954.  
  1955.     
  1956.  
  1957. \def\setshadegrid{%
  1958.   \!ifnextchar{s}{\!getspan }
  1959.     {\!getspan span <\!dshade>}}
  1960. \def\!getspan span <#1>{%
  1961.   \!dshade=#1\relax
  1962.   \!ifcoordmode 
  1963.     \let\!GRnext=\!GRccheckforAP
  1964.   \else
  1965.     \let\!GRnext=\!GRdcheckforAP
  1966.   \fi
  1967.   \!GRnext}
  1968. \def\!GRccheckforAP{%
  1969.   \!ifnextchar{p}{\!cgetanchor }
  1970.     {\!cgetanchor point at {\!xshadesave} {\!yshadesave} }}
  1971. \def\!cgetanchor point at #1 #2 {%
  1972.   \edef\!xshadesave{#1}\edef\!yshadesave{#2}%
  1973.   \!xshade=\!xshadesave\!xunit  \!yshade=\!yshadesave\!yunit
  1974.   \ignorespaces}
  1975. \def\!GRdcheckforAP{%
  1976.   \!ifnextchar{p}{\!dgetanchor}%
  1977.     {\ignorespaces}}
  1978. \def\!dgetanchor point at #1 #2 {%
  1979.   \!xshade=#1\relax  \!yshade=#2\relax
  1980.   \ignorespaces}
  1981.  
  1982. \def\setshadesymbol{%
  1983.   \!ifnextchar<{\!setshadesymbol}{\!setshadesymbol<,,,> }}
  1984.  
  1985. \def\!setshadesymbol <#1,#2,#3,#4> (#5#6){%
  1986.   \!setputobject{#5}{#6}%                        
  1987.   \setbox\!shadesymbol=\box\!putobject%
  1988.   \!shadesymbolxshift=\!xshift \!shadesymbolyshift=\!yshift
  1989.   \!dimenA=\!xshift \advance\!dimenA \!smidge% ** default LS = xshift - smidge
  1990.   \!override\!dimenA{#1}\!lshrinkage%         
  1991.   \!dimenA=\!wd \advance \!dimenA -\!xshift%   ** default RS = width - xshift
  1992.     \advance\!dimenA \!smidge%                                  - smidge
  1993.     \!override\!dimenA{#2}\!rshrinkage
  1994.   \!dimenA=\!dp \advance \!dimenA \!yshift%    ** default BS = depth + yshift
  1995.     \advance\!dimenA \!smidge%                                  - smidge
  1996.     \!override\!dimenA{#3}\!bshrinkage
  1997.   \!dimenA=\!ht \advance \!dimenA -\!yshift%   ** default TS = height - yshift
  1998.     \advance\!dimenA \!smidge%                                  - smidge
  1999.     \!override\!dimenA{#4}\!tshrinkage
  2000.   \ignorespaces}
  2001. \def\!smidge{-.2pt}%
  2002.  
  2003. \def\!override#1#2#3{%
  2004.   \edef\!!override{#2}% 
  2005.   \ifx \!!override\empty
  2006.     #3=#1\relax
  2007.   \else
  2008.     \if z\!!override
  2009.       #3=\!zpt
  2010.     \else
  2011.       \ifx \!!override\!blankz
  2012.         #3=\!zpt
  2013.       \else
  2014.         #3=#2\relax
  2015.       \fi
  2016.     \fi
  2017.   \fi
  2018.   \ignorespaces}
  2019. \def\!blankz{ z}
  2020.  
  2021. \setshadesymbol ({\fiverm .})%       ** initialize plotsymbol
  2022.  
  2023. \def\!startvshade#1(#2,#3,#4){%
  2024.   \let\!!xunit=\!xunit%
  2025.   \let\!!yunit=\!yunit%
  2026.   \let\!!xshade=\!xshade%
  2027.   \let\!!yshade=\!yshade%
  2028.   \def\!getshrinkages{\!vgetshrinkages}%
  2029.   \let\!setshadelocation=\!vsetshadelocation%
  2030.   \!xS=\!M{#2}\!!xunit
  2031.   \!ybS=\!M{#3}\!!yunit
  2032.   \!ytS=\!M{#4}\!!yunit
  2033.   \!shadexorigin=\!xorigin  \advance \!shadexorigin \!shadesymbolxshift
  2034.   \!shadeyorigin=\!yorigin  \advance \!shadeyorigin \!shadesymbolyshift
  2035.   \ignorespaces}
  2036.  
  2037. \def\!starthshade#1(#2,#3,#4){%
  2038.   \let\!!xunit=\!yunit%
  2039.   \let\!!yunit=\!xunit%
  2040.   \let\!!xshade=\!yshade%
  2041.   \let\!!yshade=\!xshade%
  2042.   \def\!getshrinkages{\!hgetshrinkages}%
  2043.   \let\!setshadelocation=\!hsetshadelocation%
  2044.   \!xS=\!M{#2}\!!xunit
  2045.   \!ybS=\!M{#3}\!!yunit
  2046.   \!ytS=\!M{#4}\!!yunit
  2047.   \!shadexorigin=\!xorigin  \advance \!shadexorigin \!shadesymbolxshift
  2048.   \!shadeyorigin=\!yorigin  \advance \!shadeyorigin \!shadesymbolyshift
  2049.   \ignorespaces}
  2050.  
  2051. \def\!lattice#1#2#3#4#5{%
  2052.   \!dimenA=#1%                        ** dimA = ANCHOR
  2053.   \!dimenB=#2%                        ** dimB = SPAN  (assumed > 0pt)
  2054.   \!countB=\!dimenB%                  ** ctB  = SPAN, as a count
  2055.   \!dimenC=#3%                        ** dimC = LOCATION
  2056.   \advance\!dimenC -\!dimenA%         ** now dimC = LOCATION-ANCHOR
  2057.   \!countA=\!dimenC%                  ** ctA = above, as a count
  2058.   \divide\!countA \!countB%           ** now ctA = desired index, if dimC <= 0
  2059.   \ifdim\!dimenC>\!zpt
  2060.     \!dimenD=\!countA\!dimenB%        ** (tentative k)*span
  2061.     \ifdim\!dimenD<\!dimenC%          ** if this is false, ctA = desired index
  2062.       \advance\!countA 1 %            ** if true, have to add 1
  2063.     \fi
  2064.   \fi
  2065.   \!dimenC=\!countA\!dimenB%          ** lattice location = anchor + ctA*span
  2066.     \advance\!dimenC \!dimenA
  2067.   #4=\!countA%                        ** the desired index
  2068.   #5=\!dimenC%                        ** corresponding lattice location
  2069.   \ignorespaces}
  2070.  
  2071. \def\!qshade#1(#2,#3,#4)#5(#6,#7,#8){%
  2072.   \!xM=\!M{#2}\!!xunit
  2073.   \!ybM=\!M{#3}\!!yunit
  2074.   \!ytM=\!M{#4}\!!yunit
  2075.   \!xE=\!M{#6}\!!xunit
  2076.   \!ybE=\!M{#7}\!!yunit
  2077.   \!ytE=\!M{#8}\!!yunit
  2078.   \!getcoeffs\!xS\!ybS\!xM\!ybM\!xE\!ybE\!ybB\!ybC%**Get coefficients B & C for
  2079.   \!getcoeffs\!xS\!ytS\!xM\!ytM\!xE\!ytE\!ytB\!ytC%**y=y0 + B(x-X0) + C(x-X0)**2
  2080.   \def\!getylimits{\!qgetylimits}%
  2081.   \!shade{#1}\ignorespaces}
  2082.  
  2083. \def\!lshade#1(#2,#3,#4){%
  2084.   \!xE=\!M{#2}\!!xunit
  2085.   \!ybE=\!M{#3}\!!yunit
  2086.   \!ytE=\!M{#4}\!!yunit
  2087.   \!dimenE=\!xE  \advance \!dimenE -\!xS%   ** xE-xS
  2088.   \!dimenC=\!ytE \advance \!dimenC -\!ytS%  ** ytE-ytS
  2089.   \!divide\!dimenC\!dimenE\!ytB%            ** ytB = (ytE-ytS)/(xE-xS)
  2090.   \!dimenC=\!ybE \advance \!dimenC -\!ybS%  ** ybE-ybS
  2091.   \!divide\!dimenC\!dimenE\!ybB%            ** ybB = (ybE-ybS)/(xE-xS)
  2092.   \def\!getylimits{\!lgetylimits}%
  2093.   \!shade{#1}\ignorespaces}
  2094.  
  2095. \def\!getcoeffs#1#2#3#4#5#6#7#8{% 
  2096.   \!dimenC=#4\advance \!dimenC -#2%            ** dimC=Y1-Y0
  2097.   \!dimenE=#3\advance \!dimenE -#1%            ** dimE=X1-X0
  2098.   \!divide\!dimenC\!dimenE\!dimenF%            ** dimF=S1
  2099.   \!dimenC=#6\advance \!dimenC -#4%            ** dimC=Y2-Y1
  2100.   \!dimenH=#5\advance \!dimenH -#3%            ** dimH=X2-X1
  2101.   \!divide\!dimenC\!dimenH\!dimenG%            ** dimG=S2
  2102.   \advance\!dimenG -\!dimenF%                  ** dimG=S2-S1
  2103.   \advance \!dimenH \!dimenE%                  ** dimH=X2-X0
  2104.   \!divide\!dimenG\!dimenH#8%                  ** C=(S2-S1)/(X2-X0)
  2105.   \!removept#8\!t%                             ** C, without "pt"
  2106.   #7=-\!t\!dimenE%                             ** -C*(X1-X0)
  2107.   \advance #7\!dimenF%                         ** B=S1-C*(X1-X0)
  2108.   \ignorespaces}
  2109.  
  2110.  
  2111. \def\!shade#1{%
  2112.   \!getshrinkages#1<,,,>\!nil% %       ** now effective LS=dimE, RS=dimF,
  2113.   \advance \!dimenE \!xS%              ** now dimE=xS+LS
  2114.   \!lattice\!!xshade\!dshade\!dimenE%  ** set parity=index of left-mst x-lattice
  2115.     \!parity\!xpos%                    **   point >= xS+LS, xpos=its location
  2116.   \!dimenF=-\!dimenF%                  ** set dimF=xE-RS
  2117.     \advance\!dimenF \!xE
  2118.   \!loop\!not{\ifdim\!xpos>\!dimenF}%  ** loop over x-lattice points <= xE-RS
  2119.     \!shadecolumn%                 
  2120.     \advance\!xpos \!dshade%           ** move over to next column
  2121.     \advance\!parity 1%                ** increase index of x-point
  2122.   \repeat
  2123.   \!xS=\!xE%                           ** shift ending values to starting values
  2124.   \!ybS=\!ybE
  2125.   \!ytS=\!ytE
  2126.   \ignorespaces}
  2127.  
  2128.  
  2129. \def\!vgetshrinkages#1<#2,#3,#4,#5>#6\!nil{%
  2130.   \!override\!lshrinkage{#2}\!dimenE
  2131.   \!override\!rshrinkage{#3}\!dimenF
  2132.   \!override\!bshrinkage{#4}\!dimenG
  2133.   \!override\!tshrinkage{#5}\!dimenH
  2134.   \ignorespaces}
  2135. \def\!hgetshrinkages#1<#2,#3,#4,#5>#6\!nil{%
  2136.   \!override\!lshrinkage{#2}\!dimenG
  2137.   \!override\!rshrinkage{#3}\!dimenH
  2138.   \!override\!bshrinkage{#4}\!dimenE
  2139.   \!override\!tshrinkage{#5}\!dimenF
  2140.   \ignorespaces}
  2141.  
  2142.  
  2143. \def\!shadecolumn{%
  2144.   \!dxpos=\!xpos
  2145.   \advance\!dxpos -\!xS%            ** dx = x - xS
  2146.   \!removept\!dxpos\!dx%            ** ditto, without "pt"
  2147.   \!getylimits%                     ** get top and bottom y-values
  2148.   \advance\!ytpos -\!dimenH%        ** less TS
  2149.   \advance\!ybpos \!dimenG%         ** plus BS
  2150.   \!yloc=\!!yshade%                 ** get anchor point for this column
  2151.   \ifodd\!parity 
  2152.      \advance\!yloc \!dshade
  2153.   \fi
  2154.   \!lattice\!yloc{2\!dshade}\!ybpos%
  2155.     \!countA\!ypos%                 ** ypos=smallest y point for this column
  2156.   \!dimenA=-\!shadexorigin \advance \!dimenA \!xpos%      ** over
  2157.   \loop\!not{\ifdim\!ypos>\!ytpos}% ** loop over ypos <= yt(t)
  2158.     \!setshadelocation%             ** vmode: xloc=xpos, yloc=ypos 
  2159.     \!rotateaboutpivot\!xloc\!yloc%
  2160.     \!dimenA=-\!shadexorigin \advance \!dimenA \!xloc%    ** over
  2161.     \!dimenB=-\!shadeyorigin \advance \!dimenB \!yloc%    ** up
  2162.     \kern\!dimenA \raise\!dimenB\copy\!shadesymbol \kern-\!dimenA
  2163.     \advance\!ypos 2\!dshade
  2164.   \repeat
  2165.   \ignorespaces}
  2166.  
  2167. \def\!qgetylimits{%
  2168.   \!dimenA=\!dx\!ytC              
  2169.   \advance\!dimenA \!ytB%         ** yt(t)=ytS + dx*(Bt + dx*Ct)
  2170.   \!ytpos=\!dx\!dimenA
  2171.   \advance\!ytpos \!ytS
  2172.   \!dimenA=\!dx\!ybC              
  2173.   \advance\!dimenA \!ybB%         ** yb(t)=ybS + dx*(Bb + dx*Cb)
  2174.   \!ybpos=\!dx\!dimenA
  2175.   \advance\!ybpos \!ybS}
  2176.  
  2177. \def\!lgetylimits{%
  2178.   \!ytpos=\!dx\!ytB%              ** yt(t)=ytS + dx*Bt
  2179.   \advance\!ytpos \!ytS
  2180.   \!ybpos=\!dx\!ybB%              ** yb(t)=ybS + dx*Bb
  2181.   \advance\!ybpos \!ybS}
  2182.  
  2183. \def\!vsetshadelocation{%         ** vmode: xloc=xpos, yloc=ypos 
  2184.   \!xloc=\!xpos
  2185.   \!yloc=\!ypos}
  2186. \def\!hsetshadelocation{%         ** hmode: xloc=ypos, yloc=xpos 
  2187.   \!xloc=\!ypos
  2188.   \!yloc=\!xpos}
  2189.  
  2190. \def\!axisticks {%
  2191.   \def\!nextkeyword##1 {%
  2192.     \expandafter\ifx\csname !ticks##1\endcsname \relax
  2193.       \def\!next{\!fixkeyword{##1}}%
  2194.     \else
  2195.       \def\!next{\csname !ticks##1\endcsname}%
  2196.     \fi
  2197.     \!next}%
  2198.   \!axissetup
  2199.     \def\!axissetup{\relax}%
  2200.   \edef\!ticksinoutsign{\!ticksinoutSign}%
  2201.   \!ticklength=\longticklength
  2202.   \!tickwidth=\linethickness
  2203.   \!gridlinestatus
  2204.   \!setticktransform
  2205.   \!maketick
  2206.   \!tickcase=0
  2207.   \def\!LTlist{}%
  2208.   \!nextkeyword}
  2209.  
  2210. \def\ticksout{%
  2211.   \def\!ticksinoutSign{+}}
  2212. \def\ticksin{%
  2213.   \def\!ticksinoutSign{-}}
  2214. \ticksout
  2215.  
  2216. \def\gridlines{%
  2217.   \def\!gridlinestatus{\!gridlinestootrue}}
  2218. \def\nogridlines{%
  2219.   \def\!gridlinestatus{\!gridlinestoofalse}}
  2220. \nogridlines
  2221.  
  2222. \def\loggedticks{%
  2223.   \def\!setticktransform{\let\!ticktransform=\!logten}}
  2224. \def\unloggedticks{%
  2225.   \def\!setticktransform{\let\!ticktransform=\!donothing}}
  2226. \def\!donothing#1#2{\def#2{#1}}
  2227. \unloggedticks
  2228.  
  2229. \expandafter\def\csname !ticks/\endcsname{%
  2230.   \!not {\ifx \!LTlist\empty}
  2231.     \!placetickvalues
  2232.   \fi
  2233.   \def\!tickvalueslist{}%
  2234.   \def\!LTlist{}%
  2235.   \expandafter\csname !axis/\endcsname}
  2236.  
  2237. \def\!maketick{%
  2238.   \setbox\!boxA=\hbox{%
  2239.     \beginpicture
  2240.       \!setdimenmode
  2241.       \setcoordinatesystem point at {\!zpt} {\!zpt}   
  2242.       \linethickness=\!tickwidth
  2243.       \ifdim\!ticklength>\!zpt
  2244.         \putrule from {\!zpt} {\!zpt} to
  2245.           {\!ticksinoutsign\!tickxsign\!ticklength}
  2246.           {\!ticksinoutsign\!tickysign\!ticklength}
  2247.       \fi
  2248.       \if!gridlinestoo
  2249.         \putrule from {\!zpt} {\!zpt} to
  2250.           {-\!tickxsign\!xaxislength} {-\!tickysign\!yaxislength}
  2251.       \fi
  2252.     \endpicturesave <\!Xsave,\!Ysave>}%
  2253.     \wd\!boxA=\!zpt}
  2254.   
  2255. \def\!ticksin{%
  2256.   \def\!ticksinoutsign{-}%
  2257.   \!maketick
  2258.   \!nextkeyword}
  2259.  
  2260. \def\!ticksout{%
  2261.   \def\!ticksinoutsign{+}%
  2262.   \!maketick
  2263.   \!nextkeyword}
  2264.  
  2265. \def\!tickslength<#1> {%
  2266.   \!ticklength=#1\relax
  2267.   \!maketick
  2268.   \!nextkeyword}
  2269.  
  2270. \def\!tickslong{%
  2271.   \!tickslength<\longticklength> }
  2272.  
  2273. \def\!ticksshort{%
  2274.   \!tickslength<\shortticklength> }
  2275.  
  2276. \def\!tickswidth<#1> {%
  2277.   \!tickwidth=#1\relax
  2278.   \!maketick
  2279.   \!nextkeyword}
  2280.  
  2281. \def\!ticksandacross{%
  2282.   \!gridlinestootrue
  2283.   \!maketick
  2284.   \!nextkeyword}
  2285.  
  2286. \def\!ticksbutnotacross{%
  2287.   \!gridlinestoofalse
  2288.   \!maketick
  2289.   \!nextkeyword}
  2290.  
  2291. \def\!tickslogged{%
  2292.   \let\!ticktransform=\!logten
  2293.   \!nextkeyword}
  2294.  
  2295. \def\!ticksunlogged{%
  2296.   \let\!ticktransform=\!donothing
  2297.   \!nextkeyword}
  2298.  
  2299. \def\!ticksunlabeled{%
  2300.   \!tickcase=0
  2301.   \!nextkeyword}
  2302.  
  2303. \def\!ticksnumbered{%
  2304.   \!tickcase=1
  2305.   \!nextkeyword}
  2306.  
  2307. \def\!tickswithvalues#1/ {%
  2308.   \edef\!tickvalueslist{#1! /}%
  2309.   \!tickcase=2
  2310.   \!nextkeyword}
  2311.  
  2312. \def\!ticksquantity#1 {%
  2313.   \ifnum #1>1
  2314.     \!updatetickoffset
  2315.     \!countA=#1\relax
  2316.     \advance \!countA -1
  2317.     \!ticklocationincr=\!axisLength
  2318.       \divide \!ticklocationincr \!countA
  2319.     \!ticklocation=\!axisstart
  2320.     \loop \!not{\ifdim \!ticklocation>\!axisend}
  2321.       \!placetick\!ticklocation
  2322.       \ifcase\!tickcase
  2323.           \relax %  Case 0: no labels
  2324.         \or
  2325.           \relax %  Case 1: numbered -- not available here
  2326.         \or
  2327.           \expandafter\!gettickvaluefrom\!tickvalueslist
  2328.           \edef\!tickfield{{\the\!ticklocation}{\!value}}%
  2329.           \expandafter\!listaddon\expandafter{\!tickfield}\!LTlist%
  2330.       \fi
  2331.       \advance \!ticklocation \!ticklocationincr
  2332.     \repeat
  2333.   \fi
  2334.   \!nextkeyword}
  2335.  
  2336. \def\!ticksat#1 {%
  2337.   \!updatetickoffset
  2338.   \edef\!Loc{#1}%
  2339.   \if /\!Loc
  2340.     \def\next{\!nextkeyword}%
  2341.   \else
  2342.     \!ticksincommon
  2343.     \def\next{\!ticksat}%
  2344.   \fi
  2345.   \next}    
  2346.       
  2347. \def\!ticksfrom#1 to #2 by #3 {%
  2348.   \!updatetickoffset
  2349.   \edef\!arg{#3}%
  2350.   \expandafter\!separate\!arg\!nil
  2351.   \!scalefactor=1
  2352.   \expandafter\!countfigures\!arg/
  2353.   \edef\!arg{#1}%
  2354.   \!scaleup\!arg by\!scalefactor to\!countE
  2355.   \edef\!arg{#2}%
  2356.   \!scaleup\!arg by\!scalefactor to\!countF
  2357.   \edef\!arg{#3}%
  2358.   \!scaleup\!arg by\!scalefactor to\!countG
  2359.   \loop \!not{\ifnum\!countE>\!countF}
  2360.     \ifnum\!scalefactor=1
  2361.       \edef\!Loc{\the\!countE}%
  2362.     \else
  2363.       \!scaledown\!countE by\!scalefactor to\!Loc
  2364.     \fi
  2365.     \!ticksincommon
  2366.     \advance \!countE \!countG
  2367.   \repeat
  2368.   \!nextkeyword}
  2369.  
  2370. \def\!updatetickoffset{%
  2371.   \!dimenA=\!ticksinoutsign\!ticklength
  2372.   \ifdim \!dimenA>\!offset
  2373.     \!offset=\!dimenA
  2374.   \fi}
  2375.  
  2376. \def\!placetick#1{%
  2377.   \if!xswitch
  2378.     \!xpos=#1\relax
  2379.     \!ypos=\!axisylevel
  2380.   \else
  2381.     \!xpos=\!axisxlevel
  2382.     \!ypos=#1\relax
  2383.   \fi
  2384.   \advance\!xpos \!Xsave
  2385.   \advance\!ypos \!Ysave
  2386.   \kern\!xpos\raise\!ypos\copy\!boxA\kern-\!xpos
  2387.   \ignorespaces}
  2388.  
  2389. \def\!gettickvaluefrom#1 #2 /{%
  2390.   \edef\!value{#1}%
  2391.   \edef\!tickvalueslist{#2 /}%
  2392.   \ifx \!tickvalueslist\!endtickvaluelist
  2393.     \!tickcase=0
  2394.   \fi}
  2395. \def\!endtickvaluelist{! /}
  2396.  
  2397. \def\!ticksincommon{%
  2398.   \!ticktransform\!Loc\!t
  2399.   \!ticklocation=\!t\!!unit
  2400.   \advance\!ticklocation -\!!origin
  2401.   \!placetick\!ticklocation
  2402.   \ifcase\!tickcase
  2403.     \relax % Case 0: no labels
  2404.   \or %      Case 1: numbered
  2405.     \ifdim\!ticklocation<-\!!origin
  2406.       \edef\!Loc{$\!Loc$}%
  2407.     \fi
  2408.     \edef\!tickfield{{\the\!ticklocation}{\!Loc}}%
  2409.     \expandafter\!listaddon\expandafter{\!tickfield}\!LTlist%
  2410.   \or %      Case 2: labeled
  2411.     \expandafter\!gettickvaluefrom\!tickvalueslist
  2412.     \edef\!tickfield{{\the\!ticklocation}{\!value}}%
  2413.     \expandafter\!listaddon\expandafter{\!tickfield}\!LTlist%
  2414.   \fi}
  2415.  
  2416. \def\!separate#1\!nil{%
  2417.   \!ifnextchar{-}{\!!separate}{\!!!separate}#1\!nil}
  2418. \def\!!separate-#1\!nil{%
  2419.   \def\!sign{-}%
  2420.   \!!!!separate#1..\!nil}
  2421. \def\!!!separate#1\!nil{%
  2422.   \def\!sign{+}%
  2423.   \!!!!separate#1..\!nil}
  2424. \def\!!!!separate#1.#2.#3\!nil{%
  2425.   \def\!arg{#1}%
  2426.   \ifx\!arg\!empty
  2427.     \!countA=0
  2428.   \else
  2429.     \!countA=\!arg
  2430.   \fi
  2431.   \def\!arg{#2}%
  2432.   \ifx\!arg\!empty
  2433.     \!countB=0
  2434.   \else
  2435.     \!countB=\!arg
  2436.   \fi}
  2437.  
  2438. \def\!countfigures#1{%
  2439.   \if #1/%
  2440.     \def\!next{\ignorespaces}%
  2441.   \else
  2442.     \multiply\!scalefactor 10
  2443.     \def\!next{\!countfigures}%
  2444.   \fi
  2445.   \!next}
  2446.  
  2447. \def\!scaleup#1by#2to#3{%
  2448.   \expandafter\!separate#1\!nil
  2449.   \multiply\!countA #2\relax
  2450.   \advance\!countA \!countB
  2451.   \if -\!sign
  2452.     \!countA=-\!countA
  2453.   \fi
  2454.   #3=\!countA
  2455.   \ignorespaces}
  2456.  
  2457. \def\!scaledown#1by#2to#3{%
  2458.   \!countA=#1\relax%                          ** get original #
  2459.   \ifnum \!countA<0 %                         ** take abs value,
  2460.     \def\!sign{-}%                            **   remember sign
  2461.     \!countA=-\!countA
  2462.   \else
  2463.     \def\!sign{}%
  2464.   \fi
  2465.   \!countB=\!countA%                          ** copy |#|
  2466.   \divide\!countB #2\relax%                   ** integer part (|#|/sf)
  2467.   \!countC=\!countB%                          ** get sf * (|#|/sf)
  2468.     \multiply\!countC #2\relax
  2469.   \advance \!countA -\!countC%                ** ctA is now remainder
  2470.   \edef#3{\!sign\the\!countB.}%               ** +- integerpart.
  2471.   \!countC=\!countA %                         ** Tack on proper number
  2472.   \ifnum\!countC=0 %                          **   of zeros after .
  2473.     \!countC=1
  2474.   \fi
  2475.   \multiply\!countC 10
  2476.   \!loop \ifnum #2>\!countC
  2477.     \edef#3{#3\!zero}%
  2478.     \multiply\!countC 10
  2479.   \repeat
  2480.   \edef#3{#3\the\!countA}%                    ** Add on rest of remainder
  2481.   \ignorespaces}
  2482.  
  2483. \def\!placetickvalues{%
  2484.   \advance\!offset \tickstovaluesleading
  2485.   \if!xswitch
  2486.     \setbox\!boxA=\hbox{%
  2487.       \def\\##1##2{%
  2488.         \!dimenput {##2} [B] (##1,\!axisylevel)}%
  2489.       \beginpicture 
  2490.         \!LTlist
  2491.       \endpicturesave <\!Xsave,\!Ysave>}%
  2492.     \!dimenA=\!axisylevel
  2493.       \advance\!dimenA -\!Ysave
  2494.       \advance\!dimenA \!tickysign\!offset
  2495.       \if -\!tickysign
  2496.         \advance\!dimenA -\ht\!boxA
  2497.       \else
  2498.         \advance\!dimenA  \dp\!boxA
  2499.       \fi
  2500.     \advance\!offset \ht\!boxA 
  2501.       \advance\!offset \dp\!boxA
  2502.     \!dimenput {\box\!boxA} [Bl] <\!Xsave,\!Ysave> (\!zpt,\!dimenA)
  2503.   \else
  2504.     \setbox\!boxA=\hbox{%
  2505.       \def\\##1##2{%
  2506.         \!dimenput {##2} [r] (\!axisxlevel,##1)}%
  2507.       \beginpicture 
  2508.         \!LTlist
  2509.       \endpicturesave <\!Xsave,\!Ysave>}%
  2510.     \!dimenA=\!axisxlevel
  2511.       \advance\!dimenA -\!Xsave
  2512.       \advance\!dimenA \!tickxsign\!offset
  2513.       \if -\!tickxsign
  2514.         \advance\!dimenA -\wd\!boxA
  2515.       \fi
  2516.     \advance\!offset \wd\!boxA
  2517.     \!dimenput {\box\!boxA} [Bl] <\!Xsave,\!Ysave> (\!dimenA,\!zpt)
  2518.   \fi}
  2519.  
  2520. \normalgraphs
  2521. \catcode`!=12 %  *****  THIS MUST NEVER BE OMITTED
  2522.  
  2523.  
  2524. \catcode`@=11 \catcode`!=11
  2525.   
  2526. \let\!pictexendpicture=\endpicture 
  2527. \let\!pictexframe=\frame
  2528. \let\!pictexlinethickness=\linethickness
  2529. \let\!pictexmultiput=\multiput
  2530. \let\!pictexput=\put
  2531.  
  2532. \def\beginpicture{%
  2533.   \setbox\!picbox=\hbox\bgroup%
  2534.   \let\endpicture=\!pictexendpicture
  2535.   \let\frame=\!pictexframe
  2536.   \let\linethickness=\!pictexlinethickness
  2537.   \let\multiput=\!pictexmultiput
  2538.   \let\put=\!pictexput
  2539.   \let\input=\@@input   % \@@input is LaTeX's saved version of TeX's primitive
  2540.   \!xleft=\maxdimen  
  2541.   \!xright=-\maxdimen
  2542.   \!ybot=\maxdimen
  2543.   \!ytop=-\maxdimen}
  2544.  
  2545. \let\frame=\!latexframe
  2546.  
  2547. \let\pictexframe=\!pictexframe
  2548.  
  2549. \let\linethickness=\!latexlinethickness
  2550. \let\pictexlinethickness=\!pictexlinethickness
  2551.  
  2552. \let\\=\@normalcr
  2553. \catcode`@=12 \catcode`!=12
  2554.